<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3292493590960629250</id><updated>2012-02-04T11:36:46.880+04:00</updated><category term='LINQ'/><category term='Флот'/><category term='Литература'/><category term='Разное'/><category term='DataSet'/><category term='VisualStudio'/><category term='Sync Framework'/><category term='Unity'/><category term='asp.net'/><category term='patterns and practices'/><category term='IOC'/><category term='LINQ to DataSet'/><category term='C# 4'/><category term='Мысли вслух'/><category term='WPF'/><category term='DataBase'/><category term='ASP.NET MVC'/><category term='Extension methods'/><category term='ADO.NET'/><title type='text'>Просто заметки</title><subtitle type='html'>Иногда из моряков получаются программисты...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://alex.algel.name/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://alex.algel.name/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>algel</name><uri>http://www.blogger.com/profile/01266074436759408164</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-8220436231622940542</id><published>2011-02-27T21:00:00.000+03:00</published><updated>2011-02-27T21:00:39.920+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>Переключение режима редактирования формы (WPF)</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Довольно часто возникает необходимость отображения данных на форме в двух режимах: редактирование и только чтение. Проблема в том, что не у всех контролов есть свойство IsReadOnly. Более того, некоторые контролы трактуют значение этого свойства по своему (Например для ComboBox.IsReadOnly = True включает режим использования только для чтения, в котором содержимое поля со списком можно выбирать, но не редактировать. Т.е. значение под комбиком по прежнему можно менять.) Также имеет смысл в режиме “только чтение” заменять сложные контролы на простые, например вместо ComboBox и DatetimePicker отобразить TextBox или MaskedTextBox.&lt;br /&gt;Допустим у нас есть некая форма редактирования контакта и мы хотим, что бы в режиме просмотра она выглядела чуть-чуть иначе.&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_acCthH_ISgQ/TWqQnLNWvSI/AAAAAAAAADU/waw2VcnjyXo/s1600-h/2011-02-27_1207202.png"&gt;&lt;img alt="Форма в режиме редактирования." border="0" height="197" src="http://lh4.ggpht.com/_acCthH_ISgQ/TWqQngHL6OI/AAAAAAAAADY/jSQbDPBTVnA/2011-02-27_120720_thumb.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Форма в режиме редактирования." width="244" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://lh6.ggpht.com/_acCthH_ISgQ/TWqQoP0b5UI/AAAAAAAAADc/dPJIgZFxi5k/s1600-h/2011-02-27_1208102.png"&gt;&lt;img alt="Форма в режиме чтения." border="0" height="196" src="http://lh4.ggpht.com/_acCthH_ISgQ/TWqQopvjVbI/AAAAAAAAADg/lv4u9_sFR84/2011-02-27_120810_thumb.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Форма в режиме чтения." width="244" /&gt;&lt;/a&gt;&lt;br /&gt;О том как этого добиться с минимальными усилиями я и хочу рассказать.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Вот так выглядит код разметки для этой формы:&lt;br /&gt;&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Window&lt;/span&gt; &lt;span style="color: red;"&gt;x:Class&lt;/span&gt;&lt;span style="color: blue;"&gt;="SwitchToReadOnly.ContactWindow"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;         &lt;span style="color: red;"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;         &lt;span style="color: red;"&gt;xmlns:x&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;         &lt;span style="color: red;"&gt;Title&lt;/span&gt;&lt;span style="color: blue;"&gt;="Contact"&lt;/span&gt; &lt;span style="color: red;"&gt;Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="300"&lt;/span&gt; &lt;span style="color: red;"&gt;Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="300"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Grid&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;ColumnDefinition&lt;/span&gt; &lt;span style="color: red;"&gt;Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="Auto"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;ColumnDefinition&lt;/span&gt; &lt;span style="color: red;"&gt;Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="*"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum9" style="color: #606060;"&gt;   9:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum10" style="color: #606060;"&gt;  10:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum11" style="color: #606060;"&gt;  11:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: red;"&gt;Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="Auto"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum12" style="color: #606060;"&gt;  12:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: red;"&gt;Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="Auto"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum13" style="color: #606060;"&gt;  13:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: red;"&gt;Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="Auto"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum14" style="color: #606060;"&gt;  14:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: red;"&gt;Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="Auto"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum15" style="color: #606060;"&gt;  15:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: red;"&gt;Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="Auto"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum16" style="color: #606060;"&gt;  16:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: red;"&gt;Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="Auto"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum17" style="color: #606060;"&gt;  17:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: red;"&gt;Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="*"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum18" style="color: #606060;"&gt;  18:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: red;"&gt;Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="Auto"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum19" style="color: #606060;"&gt;  19:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum20" style="color: #606060;"&gt;  20:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum21" style="color: #606060;"&gt;  21:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Label&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Column&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Фамилия&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Label&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum22" style="color: #606060;"&gt;  22:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Label&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Column&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="1"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Имя&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Label&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum23" style="color: #606060;"&gt;  23:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Label&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Column&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="2"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Отчество&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Label&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum24" style="color: #606060;"&gt;  24:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Label&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Column&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="3"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Должность&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Label&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum25" style="color: #606060;"&gt;  25:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Label&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Column&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="4"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Телефон&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Label&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum26" style="color: #606060;"&gt;  26:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Label&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Column&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="5"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Email&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Label&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum27" style="color: #606060;"&gt;  27:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum28" style="color: #606060;"&gt;  28:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;TextBox&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Column&lt;/span&gt;&lt;span style="color: blue;"&gt;="1"&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&lt;/span&gt; &lt;span style="color: red;"&gt;Text&lt;/span&gt;&lt;span style="color: blue;"&gt;="{Binding LastName, Mode=TwoWay}"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum29" style="color: #606060;"&gt;  29:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;TextBox&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Column&lt;/span&gt;&lt;span style="color: blue;"&gt;="1"&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="1"&lt;/span&gt; &lt;span style="color: red;"&gt;Text&lt;/span&gt;&lt;span style="color: blue;"&gt;="{Binding FirstName, Mode=TwoWay}"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum30" style="color: #606060;"&gt;  30:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;TextBox&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Column&lt;/span&gt;&lt;span style="color: blue;"&gt;="1"&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="2"&lt;/span&gt; &lt;span style="color: red;"&gt;Text&lt;/span&gt;&lt;span style="color: blue;"&gt;="{Binding SecondName, Mode=TwoWay}"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum31" style="color: #606060;"&gt;  31:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;ComboBox&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Column&lt;/span&gt;&lt;span style="color: blue;"&gt;="1"&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="3"&lt;/span&gt; &lt;span style="color: red;"&gt;ItemsSource&lt;/span&gt;&lt;span style="color: blue;"&gt;="{Binding Positions}"&lt;/span&gt; &lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum32" style="color: #606060;"&gt;  32:&lt;/span&gt;                   &lt;span style="color: red;"&gt;SelectedItem&lt;/span&gt;&lt;span style="color: blue;"&gt;="{Binding Position, Mode=TwoWay}"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum33" style="color: #606060;"&gt;  33:&lt;/span&gt;                   &lt;span style="color: red;"&gt;DisplayMemberPath&lt;/span&gt;&lt;span style="color: blue;"&gt;="Name"&lt;/span&gt; &lt;span style="color: red;"&gt;IsReadOnly&lt;/span&gt;&lt;span style="color: blue;"&gt;="True"&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum34" style="color: #606060;"&gt;  34:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;TextBox&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Column&lt;/span&gt;&lt;span style="color: blue;"&gt;="1"&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="4"&lt;/span&gt; &lt;span style="color: red;"&gt;Text&lt;/span&gt;&lt;span style="color: blue;"&gt;="{Binding Phone, Mode=TwoWay}"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum35" style="color: #606060;"&gt;  35:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;TextBox&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Column&lt;/span&gt;&lt;span style="color: blue;"&gt;="1"&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="5"&lt;/span&gt; &lt;span style="color: red;"&gt;Text&lt;/span&gt;&lt;span style="color: blue;"&gt;="{Binding Email, Mode=TwoWay}"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum36" style="color: #606060;"&gt;  36:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum37" style="color: #606060;"&gt;  37:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;DockPanel&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Column&lt;/span&gt;&lt;span style="color: blue;"&gt;="1"&lt;/span&gt; &lt;span style="color: red;"&gt;Grid&lt;/span&gt;.&lt;span style="color: red;"&gt;Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="7"&lt;/span&gt; &lt;span style="color: red;"&gt;LastChildFill&lt;/span&gt;&lt;span style="color: blue;"&gt;="False"&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum38" style="color: #606060;"&gt;  38:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Button&lt;/span&gt; &lt;span style="color: red;"&gt;DockPanel&lt;/span&gt;.&lt;span style="color: red;"&gt;Dock&lt;/span&gt;&lt;span style="color: blue;"&gt;="Right"&lt;/span&gt; &lt;span style="color: red;"&gt;Command&lt;/span&gt;&lt;span style="color: blue;"&gt;="{Binding CancelCommand}"&lt;/span&gt; &lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum39" style="color: #606060;"&gt;  39:&lt;/span&gt;                     &lt;span style="color: red;"&gt;Style&lt;/span&gt;&lt;span style="color: blue;"&gt;="{StaticResource CancelButton}"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Отмена&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum40" style="color: #606060;"&gt;  40:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Button&lt;/span&gt; &lt;span style="color: red;"&gt;DockPanel&lt;/span&gt;.&lt;span style="color: red;"&gt;Dock&lt;/span&gt;&lt;span style="color: blue;"&gt;="Right"&lt;/span&gt; &lt;span style="color: red;"&gt;Command&lt;/span&gt;&lt;span style="color: blue;"&gt;="{Binding AcceptCommand}"&lt;/span&gt; &lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum41" style="color: #606060;"&gt;  41:&lt;/span&gt;                     &lt;span style="color: red;"&gt;Style&lt;/span&gt;&lt;span style="color: blue;"&gt;="{StaticResource AcceptButton}"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Сохранить&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum42" style="color: #606060;"&gt;  42:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;DockPanel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum43" style="color: #606060;"&gt;  43:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Grid&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum44" style="color: #606060;"&gt;  44:&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Window&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Как видите ничего необычного, типичная форма редактирования с использованием шаблона MVVM. Для того что бы перевести ее в режим чтения нам понадобится создать одно attached property и несколько стилей.&lt;br /&gt;&lt;br /&gt;Сначала создадим класс EditMode и объявим в нем&amp;nbsp; attached property IsReadOnly. В итоге наш класс будет выглядеть так: &lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;&lt;br /&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; using System.Windows;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt; namespace SwitchToReadOnly&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;     public class EditMode&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt;         public static readonly DependencyProperty IsReadOnlyProperty =&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum9" style="color: #606060;"&gt;   9:&lt;/span&gt;             DependencyProperty.RegisterAttached("IsReadOnly", typeof(bool), &lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum10" style="color: #606060;"&gt;  10:&lt;/span&gt;             typeof(EditMode), new UIPropertyMetadata(false));&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum11" style="color: #606060;"&gt;  11:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum12" style="color: #606060;"&gt;  12:&lt;/span&gt;         public static bool GetIsReadOnly(DependencyObject obj)&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum13" style="color: #606060;"&gt;  13:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum14" style="color: #606060;"&gt;  14:&lt;/span&gt;             return (bool)obj.GetValue(IsReadOnlyProperty);&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum15" style="color: #606060;"&gt;  15:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum16" style="color: #606060;"&gt;  16:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum17" style="color: #606060;"&gt;  17:&lt;/span&gt;         public static void SetIsReadOnly(DependencyObject obj, bool value)&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum18" style="color: #606060;"&gt;  18:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum19" style="color: #606060;"&gt;  19:&lt;/span&gt;             obj.SetValue(IsReadOnlyProperty, value);&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum20" style="color: #606060;"&gt;  20:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum21" style="color: #606060;"&gt;  21:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum22" style="color: #606060;"&gt;  22:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;В дальнейшем это свойство будет использовано в триггерах стилей, которые и будут изменять внешний облик контролов.&lt;br /&gt;Для удобства, сначала сделаем базовый стиль, в котором привяжем свойство EditMode.IsReadOnly к соответствующему свойству вью-модели:&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;&lt;br /&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style&lt;/span&gt; &lt;span style="color: red;"&gt;TargetType&lt;/span&gt;&lt;span style="color: blue;"&gt;="Control"&lt;/span&gt; &lt;span style="color: red;"&gt;x:Key&lt;/span&gt;&lt;span style="color: blue;"&gt;="BaseStyle"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter&lt;/span&gt; &lt;span style="color: red;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="SwitchToReadOnly:EditMode.IsReadOnly"&lt;/span&gt; &lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;             &lt;span style="color: red;"&gt;Value&lt;/span&gt;&lt;span style="color: blue;"&gt;="{Binding IsReadOnly}"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter&lt;/span&gt; &lt;span style="color: red;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="Margin"&lt;/span&gt; &lt;span style="color: red;"&gt;Value&lt;/span&gt;&lt;span style="color: blue;"&gt;="2"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Для TextBox стиль будет выглядеть следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;&lt;br /&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style&lt;/span&gt; &lt;span style="color: red;"&gt;TargetType&lt;/span&gt;&lt;span style="color: blue;"&gt;="TextBox"&lt;/span&gt; &lt;span style="color: red;"&gt;BasedOn&lt;/span&gt;&lt;span style="color: blue;"&gt;="{StaticResource BaseStyle}"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Trigger&lt;/span&gt; &lt;span style="color: red;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="SwitchToReadOnly:EditMode.IsReadOnly"&lt;/span&gt; &lt;span style="color: red;"&gt;Value&lt;/span&gt;&lt;span style="color: blue;"&gt;="True"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter&lt;/span&gt; &lt;span style="color: red;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="IsReadOnly"&lt;/span&gt; &lt;span style="color: red;"&gt;Value&lt;/span&gt;&lt;span style="color: blue;"&gt;="True"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter&lt;/span&gt; &lt;span style="color: red;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="Background"&lt;/span&gt; &lt;span style="color: red;"&gt;Value&lt;/span&gt;&lt;span style="color: blue;"&gt;="LightGray"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Trigger&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Здесь мы просто устанавливаем значение True для штатного свойства TextBox.IsReadOnly и меняем фон на серый. А вот с ComboBox’ом чуть сложнее, поскольку тут нам нужно подменить контрол на TextBox:&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;&lt;br /&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style&lt;/span&gt; &lt;span style="color: red;"&gt;TargetType&lt;/span&gt;&lt;span style="color: blue;"&gt;="ComboBox"&lt;/span&gt; &lt;span style="color: red;"&gt;BasedOn&lt;/span&gt;&lt;span style="color: blue;"&gt;="{StaticResource BaseStyle}"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Trigger&lt;/span&gt; &lt;span style="color: red;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="SwitchToReadOnly:EditMode.IsReadOnly"&lt;/span&gt; &lt;span style="color: red;"&gt;Value&lt;/span&gt;&lt;span style="color: blue;"&gt;="True"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter&lt;/span&gt; &lt;span style="color: red;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="Template"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;                 &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;                     &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;ControlTemplate&lt;/span&gt; &lt;span style="color: red;"&gt;TargetType&lt;/span&gt;&lt;span style="color: blue;"&gt;="ComboBox"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;                         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;TextBox&lt;/span&gt; &lt;span style="color: red;"&gt;Margin&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&lt;/span&gt; &lt;span style="color: red;"&gt;Text&lt;/span&gt;&lt;span style="color: blue;"&gt;="{TemplateBinding Text}"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt;                     &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum9" style="color: #606060;"&gt;   9:&lt;/span&gt;                 &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum10" style="color: #606060;"&gt;  10:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum11" style="color: #606060;"&gt;  11:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Trigger&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum12" style="color: #606060;"&gt;  12:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum13" style="color: #606060;"&gt;  13:&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Добавим еще стили для кнопок. Кнопка “Сохранть” должна быть видимой только в режиме редактирования:&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;&lt;br /&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style&lt;/span&gt; &lt;span style="color: red;"&gt;TargetType&lt;/span&gt;&lt;span style="color: blue;"&gt;="Button"&lt;/span&gt; &lt;span style="color: red;"&gt;x:Key&lt;/span&gt;&lt;span style="color: blue;"&gt;="AcceptButton"&lt;/span&gt; &lt;span style="color: red;"&gt;BasedOn&lt;/span&gt;&lt;span style="color: blue;"&gt;="{StaticResource BaseStyle}"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter&lt;/span&gt; &lt;span style="color: red;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="Content"&lt;/span&gt; &lt;span style="color: red;"&gt;Value&lt;/span&gt;&lt;span style="color: blue;"&gt;="Сохранить"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Trigger&lt;/span&gt; &lt;span style="color: red;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="SwitchToReadOnly:EditMode.IsReadOnly"&lt;/span&gt; &lt;span style="color: red;"&gt;Value&lt;/span&gt;&lt;span style="color: blue;"&gt;="True"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter&lt;/span&gt; &lt;span style="color: red;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="Visibility"&lt;/span&gt; &lt;span style="color: red;"&gt;Value&lt;/span&gt;&lt;span style="color: blue;"&gt;="Collapsed"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Trigger&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;А кнопка “Отмена” в режиме просмотра будет менять свой текст на “Закрыть”:&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;&lt;br /&gt;&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style&lt;/span&gt; &lt;span style="color: red;"&gt;TargetType&lt;/span&gt;&lt;span style="color: blue;"&gt;="Button"&lt;/span&gt; &lt;span style="color: red;"&gt;x:Key&lt;/span&gt;&lt;span style="color: blue;"&gt;="CancelButton"&lt;/span&gt; &lt;span style="color: red;"&gt;BasedOn&lt;/span&gt;&lt;span style="color: blue;"&gt;="{StaticResource BaseStyle}"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter&lt;/span&gt; &lt;span style="color: red;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="Content"&lt;/span&gt; &lt;span style="color: red;"&gt;Value&lt;/span&gt;&lt;span style="color: blue;"&gt;="Отменить"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Trigger&lt;/span&gt; &lt;span style="color: red;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="SwitchToReadOnly:EditMode.IsReadOnly"&lt;/span&gt; &lt;span style="color: red;"&gt;Value&lt;/span&gt;&lt;span style="color: blue;"&gt;="True"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter&lt;/span&gt; &lt;span style="color: red;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="ContentTemplate"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;                 &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;                     &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;DataTemplate&lt;/span&gt; &lt;span style="color: red;"&gt;DataType&lt;/span&gt;&lt;span style="color: blue;"&gt;="Button"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt;                         &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;TextBlock&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Закрыть&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;TextBlock&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum9" style="color: #606060;"&gt;   9:&lt;/span&gt;                     &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum10" style="color: #606060;"&gt;  10:&lt;/span&gt;                 &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum11" style="color: #606060;"&gt;  11:&lt;/span&gt;             &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Setter&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum12" style="color: #606060;"&gt;  12:&lt;/span&gt;         &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Trigger&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum13" style="color: #606060;"&gt;  13:&lt;/span&gt;     &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum14" style="color: #606060;"&gt;  14:&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Style&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Стили следует поместить в общие ресурсы приложения (например в App.xaml)&lt;br /&gt;Вот в принципе и все.&lt;br /&gt;&lt;br /&gt;Полный пример можно скачать здесь:&lt;br /&gt;&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://cid-2e1ae6b85e4d813f.office.live.com/embedicon.aspx/.Public/SwitchToReadOnly.zip" style="background-color: #fcfcfc; height: 115px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; width: 98px;" title="Preview"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-8220436231622940542?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/8220436231622940542/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2011/02/wpf.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/8220436231622940542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/8220436231622940542'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2011/02/wpf.html' title='Переключение режима редактирования формы (WPF)'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_acCthH_ISgQ/TWqQngHL6OI/AAAAAAAAADY/jSQbDPBTVnA/s72-c/2011-02-27_120720_thumb.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-35760735977572898</id><published>2010-08-29T00:18:00.000+04:00</published><updated>2011-08-18T21:33:47.092+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='patterns and practices'/><title type='text'>Горячие клавиши в WPF</title><content type='html'>Недавно возникла необходимость реализовать в проекте функционал горячих клавиш. Сами сочетания клавиш должны храниться в отдельном хранилище (например в xml-файле) и не должны зависеть от текущего клавиатурного фокуса на форме. При этом в проекте используется паттерн M-V-VM и &lt;a href="http://msdn.microsoft.com/en-us/library/ff650631.aspx"&gt;DelegateCommand&lt;/a&gt;. &lt;br&gt;&lt;br&gt;Поскольку стандартного механизма горячих клавиш для реализации вышеописанных требований недостаточно, было решено дополнить его своим.&lt;br&gt; &lt;a name='more'&gt;&lt;/a&gt;&lt;br&gt;Итак. Для начала создадим базовый класс для наших форм WindowBase который будет являться наследником от Window. В классе определяем свойство зависимости GlobalHotKeys в котором будем хранить список привязок к горячим клавишам.&lt;br&gt;&lt;br&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;DependencyPropertyKey&lt;/span&gt; GlobalHotKeysPropertyKey =&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt;.RegisterReadOnly(&lt;span style="color: #a31515"&gt;"GlobalHotKeys"&lt;/span&gt;,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;InputBinding&lt;/span&gt;&amp;gt;),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;HotKeyWindow&lt;/span&gt;),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;UIPropertyMetadata&lt;/span&gt;(&lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;InputBinding&lt;/span&gt;&amp;gt;()));&lt;br&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt; GlobalHotKeysProperty = GlobalHotKeysPropertyKey.DependencyProperty;&lt;br&gt;&lt;br&gt;&lt;pre style="font-family: consolas"&gt;&lt;span style="color: grey"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: grey"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Коллекция горячих клавиш срабатывающих независимо от текущего клавиатурного фокуса.&lt;/span&gt;&lt;br&gt;&lt;span style="color: grey"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;InputBinding&lt;/span&gt;&amp;gt; GlobalHotKeys&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;InputBinding&lt;/span&gt;&amp;gt;)GetValue(GlobalHotKeysProperty);&lt;br&gt;}&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;В этом же классе переопределяем метод OnPreviewKeyDown в котором ищем привязки соответствующие нажатым клавишам и, если находим, запускаем выполнение сопоставленной команды.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;void&lt;/span&gt; OnPreviewKeyDown(&lt;span style="color: #2b91af"&gt;KeyEventArgs&lt;/span&gt; e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; binding &lt;span style="color: blue"&gt;in&lt;/span&gt; GlobalHotKeys)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; keyGesture = binding.Gesture &lt;span style="color: blue"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;KeyGesture&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (keyGesture != &lt;span style="color: blue"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; keyGesture.Modifiers == &lt;span style="color: #2b91af"&gt;Keyboard&lt;/span&gt;.Modifiers &amp;amp;&amp;amp; keyGesture.Key == e.Key)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (binding.Command != &lt;span style="color: blue"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; binding.Command.CanExecute(0))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; binding.Command.Execute(0);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Handled = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;base&lt;/span&gt;.OnPreviewKeyDown(e);&lt;br&gt;}&lt;br&gt;&lt;/pre&gt;&lt;br&gt;В принципе теперь можно создавать формы наследники от WindowBase и прямо в xaml инициализировать коллекцию GlobalHotKeys. По крайней мере со стандартными командами этого вполне должно хватить. В моем случае используются DelegateCommand определенные во ViewModel, и представление использует их через привязку данных. Однако если попытаться привязать команду к свойству Command в KeyBinding, то привязка не сработает... Честно говоря я не очень понимаю почему так происходит, гугл тоже вразумительного ответа не дал, но зато подсказал как решить эту проблему =) Нужно определить команды как ресурсы формы и в дальнейшем ссылаться на них через {StaticResource}&lt;br&gt;&lt;span style="color: #a31515"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;hotkeys&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;HotKeyWindow.GlobalHotKeys&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #a31515"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;hotkeys&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ResourceKeyBinding&lt;/span&gt;&lt;span style="color: red"&gt; Command&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color: red"&gt; searchCommand&lt;/span&gt;&lt;span style="color: blue"&gt;}&lt;/span&gt;&lt;span style="color: blue"&gt;"&lt;/span&gt;&lt;span style="color: red"&gt; GestureResourceId&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;"Refresh"&lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #a31515"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;hotkeys&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;HotKeyWindow.GlobalHotKeys&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;Для этого нам понадобится класс CommandReference.&lt;br&gt;&lt;br&gt;&lt;pre style="font-family: consolas"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;CommandReference&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;Freezable&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;ICommand&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt; CommandProperty = &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: #a31515"&gt;"Command"&lt;/span&gt;, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ICommand&lt;/span&gt;), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;CommandReference&lt;/span&gt;), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;PropertyMetadata&lt;/span&gt;(&lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;PropertyChangedCallback&lt;/span&gt;(OnCommandChanged)));&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt; _canExecuteChangedHandler;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; CommandReference()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _canExecuteChangedHandler = OnCanExecuteChanged;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;ICommand&lt;/span&gt; Command&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;ICommand&lt;/span&gt;)GetValue(CommandProperty); }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;set&lt;/span&gt; { SetValue(CommandProperty, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt; ICommand Members&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;bool&lt;/span&gt; CanExecute(&lt;span style="color: blue"&gt;object&lt;/span&gt; parameter)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (Command != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; Command.CanExecute(parameter);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;void&lt;/span&gt; Execute(&lt;span style="color: blue"&gt;object&lt;/span&gt; parameter)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Command.Execute(parameter);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt; CanExecuteChanged;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;void&lt;/span&gt; OnCommandChanged(&lt;span style="color: #2b91af"&gt;DependencyObject&lt;/span&gt; d, &lt;span style="color: #2b91af"&gt;DependencyPropertyChangedEventArgs&lt;/span&gt; e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; commandReference = d &lt;span style="color: blue"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;CommandReference&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (commandReference != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; oldCommand = e.OldValue &lt;span style="color: blue"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;ICommand&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (oldCommand != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oldCommand.CanExecuteChanged -= commandReference._canExecuteChangedHandler;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; newCommand = e.NewValue &lt;span style="color: blue"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;ICommand&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (newCommand != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newCommand.CanExecuteChanged += commandReference._canExecuteChangedHandler;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;void&lt;/span&gt; OnCanExecuteChanged(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (CanExecuteChanged != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CanExecuteChanged(&lt;span style="color: blue"&gt;this&lt;/span&gt;, e);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt; Freezable&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;Freezable&lt;/span&gt; CreateInstanceCore()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;CommandReference&lt;/span&gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Сам класс взят из &lt;a href="http://wpf.codeplex.com/"&gt;MVVM-ToolKit&lt;/a&gt; и немного доработан мною.Теперь можно определить в ресурсах окна CommandReference связав его с нашей командой и везде где нужно ссылаться на этот ресурс.&lt;br&gt;&lt;span style="color: #a31515"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;hotkeys&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;HotKeyWindow.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #a31515"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green"&gt;&amp;lt;!--Определяем в ресурсах наши команды--&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #a31515"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;commands&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;CommandReference&lt;/span&gt;&lt;span style="color: red"&gt; Command&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: red"&gt; SearchCommand&lt;/span&gt;&lt;span style="color: blue"&gt;}&lt;/span&gt;&lt;span style="color: blue"&gt;"&lt;/span&gt;&lt;span style="color: red"&gt; x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Key&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;"searchCommand"&lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #a31515"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;commands&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;CommandReference&lt;/span&gt;&lt;span style="color: red"&gt; Command&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: red"&gt; OpenCommand&lt;/span&gt;&lt;span style="color: blue"&gt;}&lt;/span&gt;&lt;span style="color: blue"&gt;"&lt;/span&gt;&lt;span style="color: red"&gt; x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Key&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;span style="color: blue"&gt;"openCommand"&lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #a31515"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;hotkeys&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;HotKeyWindow.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Осталось реализовать последнее требование.&lt;br&gt;Допустим у нас уже есть некий сервис, который позволяет сохранять и получать сочетания клавиш по ключу. Сам сервис детально описывать я не буду, ограничусь лишь простейшим эмулятором.&lt;br&gt;&lt;br&gt;&lt;pre style="font-family: consolas"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;HotKeyStore&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;HotKeyStore&lt;/span&gt; _instance = &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;HotKeyStore&lt;/span&gt;();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; _keyGestures;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;HotKeyStore&lt;/span&gt; Instance&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; _instance; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; HotKeyStore()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _keyGestures = &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;void&lt;/span&gt; RegisterGesture(&lt;span style="color: blue"&gt;string&lt;/span&gt; key, &lt;span style="color: blue"&gt;string&lt;/span&gt; gesture)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (_keyGestures.ContainsKey(key))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _keyGestures[key] = gesture;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _keyGestures.Add(key, gesture);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;this&lt;/span&gt;[&lt;span style="color: blue"&gt;string&lt;/span&gt; resourceKey]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; _keyGestures.ContainsKey(resourceKey) ? _keyGestures[resourceKey] : &lt;span style="color: blue"&gt;null&lt;/span&gt;; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Напишем класс ResourceKeyBinding наследующий KeyBinding и в нем определим строковое свойство ResourceKey при инициализации которого будем получать сочетание клавиш из нашего сервиса и присваивать его свойству Gesture.&lt;br&gt;&lt;br&gt;&lt;pre style="font-family: consolas"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;ResourceKeyBinding&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;InputBinding&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt; fields&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;KeyGesture&lt;/span&gt; _resourceGesture;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;string&lt;/span&gt; _gestureResourceId;&lt;br&gt;&lt;br&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Creates a new instance of &lt;/span&gt;&lt;span style="color: grey"&gt;&amp;lt;see cref=&lt;/span&gt;&lt;span style="color: grey"&gt;"ResourceKeyBinding"&lt;/span&gt;&lt;span style="color: grey"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; ResourceKeyBinding()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt; Properties&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Gets of sets gesture resource id which is used to get key from configuration&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;string&lt;/span&gt; GestureResourceId&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; _gestureResourceId; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;set&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _gestureResourceId = &lt;span style="color: blue"&gt;value&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (!&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(_gestureResourceId))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RestoreKeyBinding(&lt;span style="color: blue"&gt;value&lt;/span&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _resourceGesture = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;Key gesture of current &lt;/span&gt;&lt;span style="color: grey"&gt;&amp;lt;see cref=&lt;/span&gt;&lt;span style="color: grey"&gt;"InputBinding"&lt;/span&gt;&lt;span style="color: grey"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af"&gt;TypeConverter&lt;/span&gt;(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;KeyGestureConverter&lt;/span&gt;)), &lt;span style="color: #2b91af"&gt;ValueSerializer&lt;/span&gt;(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;KeyGestureValueSerializer&lt;/span&gt;))]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;InputGesture&lt;/span&gt; Gesture&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; _resourceGesture ?? &lt;span style="color: blue"&gt;base&lt;/span&gt;.Gesture;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;set&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; keyGesture = &lt;span style="color: blue"&gt;value&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;KeyGesture&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (keyGesture == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;ArgumentException&lt;/span&gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;base&lt;/span&gt;.Gesture = &lt;span style="color: blue"&gt;value&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Restores key from configuration&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: grey"&gt;&amp;lt;param name=&lt;/span&gt;&lt;span style="color: grey"&gt;"gestureResourceId"&lt;/span&gt;&lt;span style="color: grey"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;Resource Id is used to find key&lt;/span&gt;&lt;span style="color: grey"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;void&lt;/span&gt; RestoreKeyBinding(&lt;span style="color: blue"&gt;string&lt;/span&gt; gestureResourceId)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;//Get HotKey&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; keyGesture = &lt;span style="color: #2b91af"&gt;HotKeyStore&lt;/span&gt;.Instance[gestureResourceId];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (!&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(keyGesture))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _resourceGesture = (&lt;span style="color: #2b91af"&gt;KeyGesture&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;KeyGestureConverter&lt;/span&gt;().ConvertFromString(keyGesture);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;/pre&gt;&lt;br&gt;Вот собственно и все.&lt;br&gt;Полностью рабочий пример можно скачать здесь:&lt;br&gt;&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-2e1ae6b85e4d813f.office.live.com/embedicon.aspx/.Public/HotKeys.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br&gt;В примере используются две команды, одна осуществляет поиск значения в коллекции строк по подстроке и вызывается либо нажатием на кнопку “Найти”, либо, если клавиатурный фокус находится в текстовом поле, по нажатию на “Enter”, либо по нажатию “F5”.&lt;br&gt;Если клавиатурный фокус находится в списке найденных элементов, то по нажатию на “Enter” будет вызван MessageBox&amp;nbsp; с текстом выбранного элемента.&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-35760735977572898?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/35760735977572898/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/08/wpf.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/35760735977572898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/35760735977572898'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/08/wpf.html' title='Горячие клавиши в WPF'/><author><name>algel</name><uri>http://www.blogger.com/profile/01266074436759408164</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-2754867393125094478</id><published>2010-05-17T23:36:00.001+04:00</published><updated>2010-05-21T00:18:45.209+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VisualStudio'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Code snippets</title><content type='html'>&lt;p&gt;Когда стоит задача создать несколько десятков однотипных классов, волей-неволей задумываешься о том как эту работу можно ускорить? Для этого существуют разные способы, начиная с копи-паста и заканчивая кодогенерацией…&lt;br&gt;Копи-паст чреват ошибками, и вообще считается злом :-). Кодогенерация вещь отличная, но… ее еще надо освоить…&lt;br&gt;Я хочу рассказать об одном из промежуточных вариантов – о сниппетах.&lt;/p&gt; &lt;a name='more'&gt;&lt;/a&gt; &lt;p&gt;&lt;strong&gt;Code snippets&lt;/strong&gt; – это заготовки кода для типовых задач, например таких как реализация геттера и сеттера свойств, циклы и пр.&lt;br&gt;В Visual Studio присутствует большое количество готовых сниппетов. Их можно увидеть выбрав в меню &lt;strong&gt;Tools&lt;/strong&gt; пункт &lt;strong&gt;Code snippets manager.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_acCthH_ISgQ/S_GankuA8OI/AAAAAAAAACc/0F_MxAzTdF8/s1600-h/codesnippets1%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="codesnippets1" border="0" alt="codesnippets1" src="http://lh3.ggpht.com/_acCthH_ISgQ/S_GaoLjVVDI/AAAAAAAAACg/ARp0J3i9Sfw/codesnippets1_thumb%5B1%5D.png?imgmax=800" width="244" height="215"&gt;&lt;/a&gt; Откроется менеджер сниппетов, в котором можно посмотреть информацию об уже установленных сниппетах, а так же подключить новые.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_acCthH_ISgQ/S_GaosCgpNI/AAAAAAAAACk/IPWW1KhIk5g/s1600-h/codesnippets2%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="codesnippets2" border="0" alt="codesnippets2" src="http://lh3.ggpht.com/_acCthH_ISgQ/S_GapCIFIfI/AAAAAAAAACo/hBeobbTfz_8/codesnippets2_thumb%5B1%5D.png?imgmax=800" width="244" height="183"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Теперь, когда мы познакомились с имеющимися сниппетами, можно попробовать их в действии. На самом деле использовать их проще простого, когда мы начинаем писать в коде имя сниппета, то оно автоматически подсвечивается с помощью IntelliSence:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_acCthH_ISgQ/S_GapoWwoRI/AAAAAAAAACs/OcitHBt1VVI/s1600-h/codesnippets3%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="codesnippets3" border="0" alt="codesnippets3" src="http://lh4.ggpht.com/_acCthH_ISgQ/S_Gap6Pv73I/AAAAAAAAACw/GxhAeLERBrY/codesnippets3_thumb%5B1%5D.png?imgmax=800" width="244" height="72"&gt;&lt;/a&gt; Набрав (или выбрав) нужное имя нажимаем клавишу &lt;strong&gt;Tab&lt;/strong&gt; (если имя было набрано не полностью, то придется нажать &lt;strong&gt;Tab&lt;/strong&gt; дважды) –&amp;nbsp; и, вместо набранного имени, будет вставлен нужный код:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_acCthH_ISgQ/S_GarplieBI/AAAAAAAAAC0/WDMQWJmiIIE/s1600-h/codesnippets4%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="codesnippets4" border="0" alt="codesnippets4" src="http://lh5.ggpht.com/_acCthH_ISgQ/S_GasO7rJxI/AAAAAAAAAC4/Eyc1F_N5Ilg/codesnippets4_thumb%5B1%5D.png?imgmax=800" width="244" height="55"&gt;&lt;/a&gt; Области кода с подсвеченным фоном являются параметрами. На приведенном выше примере параметрами являются тип и имя свойства, и имя класса, который содержит это свойство зависимости.&lt;br&gt;Помимо использования существующих сниппетов, мы так же можем создавать свои. Например нам нужно реализовать кучу свойств такого вида:&lt;/p&gt; &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; [DataMember]&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Name {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     get;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     set;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Тип и имя свойства, естественно, могут варьироваться.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Создаем новый XML файл (&lt;strong&gt;File –&amp;gt; New –&amp;gt; File –&amp;gt; XML&lt;/strong&gt;). Далее вставляем следующий фрагмент:&lt;/p&gt;&lt;br /&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;CodeSnippets&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;CodeSnippet&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Format&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="1.0.0"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Header&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;       &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;         Автосвойство с атрибутом DataMember&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;       &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;       &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Shortcut&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;         propdm&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;       &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Shortcut&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Header&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Snippet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;       &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Declarations&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Literal&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;           &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;propertyName&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;           &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Default&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;MyProperty&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Default&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;           &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ToolTip&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Имя свойства свойства&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ToolTip&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Literal&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Literal&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;           &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;propertyType&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;           &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Default&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;object&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Default&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;           &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ToolTip&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Тип свойства&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ToolTip&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Literal&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;       &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Declarations&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;       &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Code&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Language&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="CSharp"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;!&lt;/span&gt;[CDATA[&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;         [DataMember]&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;         public $propertyType$ $propertyName$ { get; set; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;         ]]&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;       &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Code&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Snippet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;CodeSnippet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;CodeSnippets&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Теперь нужно сохранить файл под именем “&lt;strong&gt;DataMemberProperty.snippet&lt;/strong&gt;” в папку “&lt;strong&gt;Мои документы\Visual Studio (номер версии)\Code Snippets\Visual C#\My Code Snippets\&lt;/strong&gt;”. Вот и все, наш code snippet готов! Сразу же после сохранения он будет доступен в IntelliSence.&lt;br&gt;Как видно из примера, синтаксис достаточно прост, в секции &lt;strong&gt;Header&lt;/strong&gt; задается описание нашего фрагмента, в &lt;strong&gt;Declarations&lt;/strong&gt; мы описали используемые переменные, значения которых будут задаваться пользователем, а в секции &lt;strong&gt;Code&lt;/strong&gt; – сам шаблон кода.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Для переменных, описываемых в секции &lt;strong&gt;Declarations&lt;/strong&gt;, можно еще указать имя функции, результат выполнения которой будет автоматически подставлен вместо имени переменной в шаблоне. Сейчас, с помощью одной из них, мы немного улучшим результат получаемый с помощью сниппета для генерации свойства зависимости, рассмотренного в начале заметки. Этот сниппет&amp;nbsp; вызывается если набрать в коде &lt;strong&gt;propdp&lt;/strong&gt; и нажать клавишу &lt;strong&gt;Tab&lt;/strong&gt;. Если помните, в сгенерированном коде, нужно было указать тип и имя свойства, а также имя класса, в котором это свойство определено. Вот от ввода имени класса мы сейчас и избавимся.&amp;nbsp; Одна из функций, поддерживаемых механизмом сниппетов, возвращает имя текущего класса. Нам остается только найти нужный сниппет&amp;nbsp; и чуть-чуть исправить его. &lt;br&gt;Файлы стандартных сниппетов располагаются в папке с Visual Studio, точное место расположения каждого сниппета можно увидеть в Code Snippets Manager. У меня необходимый файл располагается по следующему пути: “&lt;strong&gt;C:\Program Files\Microsoft Visual Studio 2010\VC#\Snippets\1033\NetFx30\propdp.snippet&lt;/strong&gt;”&lt;/p&gt;&lt;br /&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #800000"&gt;xml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="1.0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="utf-8"&lt;/span&gt; ?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;CodeSnippets&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;CodeSnippet&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Format&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="1.0.0"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Header&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Define a DependencyProperty&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Shortcut&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;propdp&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Shortcut&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Description&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Code snippet for a property using DependencyProperty as the backing store&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Description&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Author&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Microsoft Corporation&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Author&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;SnippetTypes&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;SnippetType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Expansion&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;SnippetType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;SnippetTypes&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Header&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Snippet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Declarations&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Literal&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;type&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ToolTip&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Property Type&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ToolTip&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Default&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;int&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Default&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Literal&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Literal&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;property&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ToolTip&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Property Name&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ToolTip&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Default&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;MyProperty&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Default&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Literal&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Literal&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;ownerclass&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ToolTip&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;The owning class of this Property.  Typically the class that it is declared in.&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ToolTip&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Default&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;ownerclass&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Default&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Literal&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Literal&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;defaultvalue&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ToolTip&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;The default value for this property.&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ToolTip&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Default&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;0&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Default&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Literal&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Declarations&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Code&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Language&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="csharp"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;&amp;lt;!&lt;/span&gt;[CDATA[&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum38"&gt;  38:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum39"&gt;  39:&lt;/span&gt; public $type$ $property$&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum40"&gt;  40:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum41"&gt;  41:&lt;/span&gt;     get { return ($type$)GetValue($property$Property); }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum42"&gt;  42:&lt;/span&gt;     set { SetValue($property$Property, value); }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum43"&gt;  43:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum44"&gt;  44:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum45"&gt;  45:&lt;/span&gt; // Using a DependencyProperty as the backing store for $property$.  This enables animation, styling, binding, etc...&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum46"&gt;  46:&lt;/span&gt; public static readonly DependencyProperty $property$Property = &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum47"&gt;  47:&lt;/span&gt;     DependencyProperty.Register("$property$", typeof($type$), typeof($ownerclass$), new UIPropertyMetadata($defaultvalue$));&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum48"&gt;  48:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum49"&gt;  49:&lt;/span&gt; $end$]]&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum50"&gt;  50:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Code&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum51"&gt;  51:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Snippet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum52"&gt;  52:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;CodeSnippet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum53"&gt;  53:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;CodeSnippets&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;В строках с 25 по 29 приведенного выше фрагмента описывается параметр &lt;strong&gt;ownerclass&lt;/strong&gt; с помощью которого и задается имя класса владельца. Все, что нам нужно сделать – это добавить после строки 28 следующий код:&lt;/p&gt;&lt;br /&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Function&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;ClassName()&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Function&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;И все! Теперь можно сохранить изменения и проверить сниппет в действии.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Более подробно о сниппетах можно почитать в &lt;a href="http://msdn.microsoft.com/ru-ru/library/ms165392.aspx"&gt;MSDN Library&lt;/a&gt;. От себя хочу лишь добавить, что не жалею времени потраченного на изучение данной технологии, потому что сэкономил гораздо больше.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-2754867393125094478?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/2754867393125094478/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/05/code-snippets.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/2754867393125094478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/2754867393125094478'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/05/code-snippets.html' title='Code snippets'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_acCthH_ISgQ/S_GaoLjVVDI/AAAAAAAAACg/ARp0J3i9Sfw/s72-c/codesnippets1_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-3993486708793686834</id><published>2010-04-27T23:15:00.001+04:00</published><updated>2010-04-27T23:15:14.655+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Мысли вслух'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Новый домен</title><content type='html'>&lt;p&gt;Как-то почти случайно взял да и приобрел себе домен... Сегодня перевел на него свои блоги. Так что у блога теперь такой адрес: &lt;a href="http://alex.algel.name" target="_blank"&gt;http://alex.algel.name&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;"Почти случайно" потому, что делать этого в ближайшее время как-то не планировал вовсе... То есть, конечно, было желание заиметь свой домен, но вроде бы как и не к спеху... А пару дней назад, блуждая по просторам интернета, зашел на сайт &lt;a href="http://www.reg.ru/?rid=60374" target="_blank"&gt;регистратора&lt;/a&gt; и вышел оттуда уже со своим доменом =) &lt;/p&gt; &lt;p&gt;Теперь сижу и думаю: "И нафига?" &lt;/p&gt; &lt;p&gt;Кстати у них на сайте, помимо регистрации доменов, есть возможность увидеть &lt;a href="https://www.reg.ru/newdomain/rereg?rid=60374" target="_blank"&gt;освобождающиеся домены&lt;/a&gt;, а так же можно посмотреть &lt;a href="http://stat.reg.ru/history_search?tld=ru&amp;amp;rid=60374" target="_blank"&gt;кто и когда владел интересующим вас доменом&lt;/a&gt;…&lt;/p&gt; &lt;p&gt;Еще, столкнулся с досадной неприятностью... Поскольку адрес сайта сменился, то автоматом поменялся OpenID, и те сайты, на которых я ранее регистрировался со старым адресом, теперь воспринимают меня как нового пользователя...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-3993486708793686834?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/3993486708793686834/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/04/blog-post_27.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/3993486708793686834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/3993486708793686834'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/04/blog-post_27.html' title='Новый домен'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-5221782754502355929</id><published>2010-04-18T19:01:00.002+04:00</published><updated>2010-05-17T21:29:55.554+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Создаем дерево.</title><content type='html'>&lt;div&gt;Иногда приходится сталкиваться с необходимостью отобразить на форме иерархичные данные в виде дерева. При этом сами данные хранятся в базе данных в плоском виде (Id, ParentId, Name). &lt;/div&gt; &lt;div&gt;В WPF для отображения иерархичных данных предусмотрен специальный шаблон &lt;a href="http://msdn.microsoft.com/ru-ru/library/system.windows.hierarchicaldatatemplate%28VS.90%29.aspx" target="_blank"&gt;HierarchicalDataTemplate&lt;/a&gt;, но он требует чтобы передаваемые объекты содержали в себе коллекцию дочерних элементов. И вот тут встает вопрос о поиске оптимального алгоритма преобразования плоской коллекции в иерархичную. Парочку таких алгоритмов я и хочу здесь представить.&lt;/div&gt; &lt;a name='more'&gt;&lt;/a&gt; &lt;div&gt;Итак. Мы получаем из БД плоскую коллекцию элементов, пусть это будут элементы типа &lt;b&gt;Flat&lt;/b&gt;:&lt;/div&gt; &lt;div&gt;&lt;/div&gt; &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;  &lt;span style="color: #0000ff"&gt;class&lt;/span&gt;  Flat  {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;  &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;  Id { get ; set ; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;  &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; ? ParentId { get ; set ; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;  &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;  Name { get ; set ; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Создадим наследника от &lt;b&gt;Flat&lt;/b&gt; и в него добавим свойство &lt;b&gt;Childs&lt;/b&gt;, которое будет хранить коллекцию дочерних элементов:&lt;/div&gt;&lt;br&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;  &lt;span style="color: #0000ff"&gt;class&lt;/span&gt;  Hierarchical  : Flat  {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;  IList &amp;lt;Hierarchical &amp;gt; Childs {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;         get ;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt;  set ;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;  Hierarchical() {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;         Childs = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;  List &amp;lt;Hierarchical &amp;gt;();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Теперь займемся построением дерева. &lt;/div&gt;&lt;br&gt;&lt;br /&gt;&lt;div&gt;Первый алгоритм для фанатов Linq:&lt;/div&gt;&lt;br&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;  &lt;span style="color: #0000ff"&gt;static&lt;/span&gt;  IList &amp;lt;Hierarchical &amp;gt; ConvertToHierarchyLinq(IEnumerable &amp;lt;Flat &amp;gt; flatItems) {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #008000"&gt;//Преобразуем последовательность в массив элементов Hierarchical &lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     var  array = flatItems&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;         .Select(i =&amp;gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;  Hierarchical  {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;             Id = i.Id,&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;             ParentId = i.ParentId,&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;             Name = i.Name&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;         })&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;         .ToArray();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     var  query = array.GroupJoin(&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         array,          &lt;span style="color: #008000"&gt;// Связываем массив с самим собой. &lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;         p =&amp;gt; p.Id,      &lt;span style="color: #008000"&gt;// Указываем свойство содержащее первичный ключ. &lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;         c =&amp;gt; c.ParentId,&lt;span style="color: #008000"&gt;// Указываем свойство содержащее внешний ключ. &lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;         (parent, childs) =&amp;gt; {           &lt;span style="color: #008000"&gt;// Здесь мы описываем делегат принимающий раздельно &lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;  (var  c &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;  childs) { &lt;span style="color: #008000"&gt;// родителя и коллекцию дочерних элементов. &lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;                 parent.Childs.Add(c);   &lt;span style="color: #008000"&gt;// В котором заполняем дочерние элементы &lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;         }                           &lt;span style="color: #008000"&gt;// у родителя. &lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;  parent;              &lt;span style="color: #008000"&gt;// Возвращаем заполненный родительский элемент. &lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;     }).Where(i =&amp;gt; i.ParentId == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; ); &lt;span style="color: #008000"&gt;// Здесь указываем, что нам нужны только корневые элементы. &lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;  query.ToList();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;А вторым я пользуюсь сам =)&lt;/div&gt;&lt;br&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;  &lt;span style="color: #0000ff"&gt;static&lt;/span&gt;  IList &amp;lt;Hierarchical &amp;gt; ConvertToHierarchy(IEnumerable &amp;lt;Flat &amp;gt; flatItems) {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     var  dic = flatItems.ToDictionary(k =&amp;gt; k.Id,&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;         v =&amp;gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;  Hierarchical  {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;         Id = v.Id,&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;         ParentId = v.ParentId,&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;         Name = v.Name&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     });&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     var  list = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;  List &amp;lt;Hierarchical &amp;gt;();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;  (var  node &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;  dic.Values) {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;  (node.ParentId != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; ) {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;             var  parent = dic[node.ParentId.Value];&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;             parent.Childs.Add(dic[node.Id]);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;         } &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;  {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;             list.Add(dic[node.Id]);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;  list;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;&lt;br /&gt;&lt;div&gt;Я для себя остановил выбор на втором варианте только потому, что на больших объемах данных (свыше 1000 элементов и с глубиной вложенности более 3-х уровней) он работает примерно в 2 раза быстрее .&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Полный пример с замером производительности можно &lt;a href="http://cid-2e1ae6b85e4d813f.skydrive.live.com/embedicon.aspx/.Public/Tree.zip" target="_blank"&gt;скачать отсюда&lt;/a&gt;.&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-5221782754502355929?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/5221782754502355929/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/04/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/5221782754502355929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/5221782754502355929'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/04/blog-post.html' title='Создаем дерево.'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-4204507055824271879</id><published>2010-03-20T19:04:00.001+03:00</published><updated>2010-03-20T19:04:18.716+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='Unity'/><category scheme='http://www.blogger.com/atom/ns#' term='patterns and practices'/><title type='text'>Composite Application Guidance for WPF and Silverlight</title><content type='html'>&lt;p&gt;Пару дней назад &lt;a href="http://outcoldman.ru/ru/site/index" target="_blank"&gt;Денис Гладких&lt;/a&gt; разместил на &lt;a href="http://www.techdays.ru/videos/2410.html" target="_blank"&gt;TechDays.ru&lt;/a&gt; отличный доклад по использованию &lt;a href="http://www.codeplex.com/CompositeWPF" target="_blank"&gt;CompositeWPF&lt;/a&gt;:    &lt;br /&gt;&lt;/p&gt; &lt;iframe style="width: 470px; height: 390px" src="http://www.techdays.ru/LectureViewer.aspx?LectureId=6052193f-4405-4723-93a0-5b96c5024c20" frameborder="0" scrolling="no" mce_src="http://www.techdays.ru/LectureViewer.aspx?LectureId=6052193f-4405-4723-93a0-5b96c5024c20"&gt;&lt;/iframe&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-4204507055824271879?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/4204507055824271879/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/03/composite-application-guidance-for-wpf.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/4204507055824271879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/4204507055824271879'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/03/composite-application-guidance-for-wpf.html' title='Composite Application Guidance for WPF and Silverlight'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-4813007618242056115</id><published>2010-03-17T22:15:00.001+03:00</published><updated>2010-03-17T22:15:31.597+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extension methods'/><title type='text'>Облегчаем добавление параметров к Uri</title><content type='html'>&lt;p&gt;На &lt;a href="http://codehelper.ru/questions/303/new/%D0%BA%D0%B0%D0%BA-%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82-urluri-%D0%B2-c" target="_blank"&gt;codehelper.ru&lt;/a&gt; недавно возник вопрос по поводу того как сделать так, чтобы можно было конструировать сложные Url, с большим количеством параметров, в объектной манере. В ответ на это и родился очередной extension: &lt;/p&gt;  &lt;blockquote&gt;&lt;code&gt;&lt;font color="#000000" size="2" face="Consolas, Courier New, Courier, Monospace"&gt;&lt;small&gt;&lt;a href="http://s-c.me/6120/s"&gt;Copy Source&lt;/a&gt; | &lt;a href="http://s-c.me/6120/h"&gt;Copy HTML&lt;/a&gt;&lt;/small&gt;         &lt;ol&gt;         &lt;li&gt;&lt;font color="#0000ff"&gt;public static class&lt;/font&gt; &lt;font color="#2b91af"&gt;UriExtensions&lt;/font&gt; { &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;public static&lt;/font&gt; &lt;font color="#2b91af"&gt;Uri&lt;/font&gt; AddQueryParameter(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#2b91af"&gt;Uri&lt;/font&gt; uri, &lt;font color="#0000ff"&gt;string&lt;/font&gt; name, &lt;font color="#0000ff"&gt;object value&lt;/font&gt;) { &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;var&lt;/font&gt; builder = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;UriBuilder&lt;/font&gt;(uri); &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;if&lt;/font&gt;(builder.Query!=&lt;font color="#0000ff"&gt;null&lt;/font&gt;&amp;amp;&amp;amp;builder.Query.Length&amp;gt;&lt;font color="#a31515"&gt;1&lt;/font&gt;) { &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; builder.Query = &lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(&lt;font color="#a31515"&gt;&amp;quot;{0}&amp;amp;{1}={2}&amp;quot;&lt;/font&gt;, builder.Query.Substring(&lt;font color="#a31515"&gt;1&lt;/font&gt;), name, &lt;font color="#0000ff"&gt;value&lt;/font&gt;); &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;font color="#0000ff"&gt;else&lt;/font&gt; { &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; builder.Query = &lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(&lt;font color="#a31515"&gt;&amp;quot;{0}={1}&amp;quot;&lt;/font&gt;, name, &lt;font color="#0000ff"&gt;value&lt;/font&gt;); &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;return&lt;/font&gt; builder.&lt;font color="#2b91af"&gt;Uri&lt;/font&gt;; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;          &lt;li&gt;} &lt;/li&gt;          &lt;li&gt;&amp;#160; &lt;/li&gt;       &lt;/ol&gt;     &lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;  &lt;p&gt;Теперь для конструирования Url можно написать такой код:&lt;/p&gt;  &lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"&gt;&lt;small&gt;&lt;a href="http://s-c.me/6121/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/6121/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;ol&gt;&lt;li&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt; uri = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Uri&lt;/font&gt;(&lt;font color="#A31515"&gt;"http://alexey-algel.blogspot.com/search"&lt;/font&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.AddQueryParameter(&lt;font color="#A31515"&gt;"updated-max"&lt;/font&gt;, &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;(&lt;font color="#A31515"&gt;2010&lt;/font&gt;, &lt;font color="#A31515"&gt;1&lt;/font&gt;, &lt;font color="#A31515"&gt;24&lt;/font&gt;, &lt;font color="#A31515"&gt;23&lt;/font&gt;, &lt;font color="#A31515"&gt;10&lt;/font&gt;, &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;).ToString(&lt;font color="#A31515"&gt;"yyyy-MM-ddTHH:mm:sszzz"&lt;/font&gt;))&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.AddQueryParameter(&lt;font color="#A31515"&gt;"max-results"&lt;/font&gt;, &lt;font color="#A31515"&gt;7&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine(uri.ToString());&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;/ol&gt;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;  &lt;p&gt;Который построит такой Url:&lt;/p&gt; &lt;p&gt;http://alexey-algel.blogspot.com/search?updated-max=2010-01-24T23:10:00+03:00&amp;max-results=7&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-4813007618242056115?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/4813007618242056115/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/03/uri.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/4813007618242056115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/4813007618242056115'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/03/uri.html' title='Облегчаем добавление параметров к Uri'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-8955980335147594628</id><published>2010-02-21T12:40:00.000+03:00</published><updated>2010-02-21T12:40:13.590+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Windows Live Writer</title><content type='html'>Сегодня открыл для себя эту полезную утилиту. По первым впечатлениям это действительно очень удобный инструмент, для подготовки и отправки сообщений в блог. Особенно порадовало, что во время написания заметки уже сразу видно как она будет выглядеть на странице. Это благодаря тому, что Live Writer умеет автоматически импортировать тему, установленную в настройках блога, и использует ее в качестве фона в окне редактирования.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Вот как это выглядит:&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_acCthH_ISgQ/S4D-4hH9PlI/AAAAAAAAACA/Kne1hyEhv8g/s1600-h/wlw1%5B13%5D.png"&gt;&lt;img alt="Скриншот программы" border="0" height="388" src="http://lh5.ggpht.com/_acCthH_ISgQ/S4D-5ah7mJI/AAAAAAAAACE/_RfNQZpaghI/wlw1_thumb%5B11%5D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="Скриншот программы" width="644" /&gt;&lt;/a&gt; Программа позволяет вставлять изображения, видео, карты и пр. Также есть возможность подкорректировать добавленный рисунок (изменить контраст, повернуть, наклонить, добавить водяной знак, изменить поля и т.д.) &lt;br /&gt;Имеется возможность подкючать плагины, но, к сожалению, их пока очень мало. В целом впечатления пока положительные. Единственное чего мне пока не хватает - это подсветки исходного кода.&lt;br /&gt;P.S. Эта заметка была подготовлена с помощью Windows Live Writer, впрочем это видно на скриншоте.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-8955980335147594628?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/8955980335147594628/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/02/windows-live-writer.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/8955980335147594628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/8955980335147594628'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/02/windows-live-writer.html' title='Windows Live Writer'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_acCthH_ISgQ/S4D-5ah7mJI/AAAAAAAAACE/_RfNQZpaghI/s72-c/wlw1_thumb%5B11%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-6042091577845448841</id><published>2010-02-16T01:10:00.000+03:00</published><updated>2010-02-16T01:10:36.117+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extension methods'/><category scheme='http://www.blogger.com/atom/ns#' term='C# 4'/><title type='text'>И снова о методах-расширениях</title><content type='html'>Тут как-то на досуге пришла мысль. Вот к примеру есть класс A, у которого есть наследник B и который, в свою очередь, наследуется классом C. &lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/5414/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/5414/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;public class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;A&lt;/span&gt; {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public int&lt;/span&gt; Id { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;public class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;B&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;A&lt;/span&gt; {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public string&lt;/span&gt; Name { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;public class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;C&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;B&lt;/span&gt; {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public string&lt;/span&gt; Description { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/li&gt;&lt;li&gt;} &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;Эти классы реализованы в какой-то сторонней сборке, и менять мы их не можем. А очень хочется добавить к ним еще один метод =). Казалось бы какие сложности? Можно написать extension method для класса A, и на этом успокоиться. Но все дело в том, что мы хотим иметь разные реализации этого метода для классов A и B, а для класса C будет использоваться та же реализация, что и для B. В таком случае можно написать методы расширения для классов A и B.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/5415/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/5415/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;public static class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Extensions&lt;/span&gt; {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public static void&lt;/span&gt; SayHello(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;A&lt;/span&gt; item) {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;"Hello!&amp;nbsp;I'm&amp;nbsp;class&amp;nbsp;A,&amp;nbsp;Id:{0}"&lt;/span&gt;, item.Id);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public static void&lt;/span&gt; SayHello(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;B&lt;/span&gt; item) {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;"Hello!&amp;nbsp;I'm&amp;nbsp;class&amp;nbsp;B,&amp;nbsp;Id:{0}&amp;nbsp;and&amp;nbsp;Name:&amp;nbsp;{1}"&lt;/span&gt;, item.Id, item.Name);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;} &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;А теперь представим, что у нас есть список &lt;b&gt;List &amp;lt; A &amp;gt;&lt;/b&gt; в котором находятся объекты всех трех перечисленных классов. И нам нужно пройтись по списку, вызвав этот метод-расширение  для каждого элемента.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/5416/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/5416/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;protected static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;A&lt;/span&gt;&amp;gt; _items;&lt;/li&gt;&lt;li&gt;_items = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;A&lt;/span&gt;&amp;gt;();&lt;/li&gt;&lt;li&gt;_items.AddRange(&lt;span style="color: blue;"&gt;new&lt;/span&gt;[] { &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;A&lt;/span&gt;() { Id = &lt;span style="color: #a31515;"&gt;&amp;nbsp;0&lt;/span&gt; },&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;B&lt;/span&gt;() { Id = &lt;span style="color: #a31515;"&gt;1&lt;/span&gt;, Name = &lt;span style="color: #a31515;"&gt;"class&amp;nbsp;B"&lt;/span&gt; },&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;C&lt;/span&gt;() { Id=&lt;span style="color: #a31515;"&gt;2&lt;/span&gt;, Name=&lt;span style="color: #a31515;"&gt;"class&amp;nbsp;C"&lt;/span&gt;, Description=&lt;span style="color: #a31515;"&gt;"I'm&amp;nbsp;derived&amp;nbsp;from&amp;nbsp;class&amp;nbsp;B"&lt;/span&gt;}&lt;/li&gt;&lt;li&gt;});&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; item &lt;span style="color: blue;"&gt;in&lt;/span&gt; _items) {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item.SayHello();&lt;/li&gt;&lt;li&gt;} &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Однако, скомпилировав и запустив приведенный код мы получим следующий результат:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_pkXux0Jk51I/S3m7kb8oWnI/AAAAAAAACek/YsEtYHogwx0/s1600-h/EM1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_pkXux0Jk51I/S3m7kb8oWnI/AAAAAAAACek/YsEtYHogwx0/s320/EM1.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;Т.е. для каждого элемента списка был вызван метод-расширение класса &lt;b&gt;A&lt;/b&gt;. Произошло это из-за статической привязки методов-расширений во время компиляции. Поскольку переменная &lt;b&gt;item&lt;/b&gt; имеет тип &lt;b&gt;A&lt;/b&gt; (&lt;i&gt;&lt;b&gt;foreach(var item in _items)&lt;/b&gt; преобразуется в &lt;b&gt;foreach(A item in _items)&lt;/b&gt;&lt;/i&gt;) компилятор связывает строку &lt;b&gt;item.SayHello();&lt;/b&gt; с методом &lt;b&gt;public static void SayHello(this A item)&lt;/b&gt;.&lt;br /&gt;Как же решить эту проблему? Решений можно найти несколько, но я хочу показать одно решение, с использованием ключевого слова &lt;b&gt;dynamic&lt;/b&gt;, появившегося в C#4.0.&lt;br /&gt;Нам понадобится всего лишь немного изменить класс &lt;b&gt;Extensions&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/5418/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/5418/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;public static class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Extensions&lt;/span&gt; {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public static void&lt;/span&gt; SayHello(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;A&lt;/span&gt; item) {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;dynamic&lt;/span&gt; dynamicItem = item;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SayHelloInternal(dynamicItem);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private static void&lt;/span&gt; SayHelloInternal(&lt;span style="color: #2b91af;"&gt;A&lt;/span&gt; item) {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;"Hello!&amp;nbsp;I'm&amp;nbsp;class&amp;nbsp;A,&amp;nbsp;Id:{0}"&lt;/span&gt;, item.Id);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private static void&lt;/span&gt; SayHelloInternal(&lt;span style="color: #2b91af;"&gt;B&lt;/span&gt; item) {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;"Hello!&amp;nbsp;I'm&amp;nbsp;class&amp;nbsp;B,&amp;nbsp;Id:{0}&amp;nbsp;and&amp;nbsp;Name:&amp;nbsp;{1}"&lt;/span&gt;, item.Id, item.Name);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;} &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Идея здесь в том, что нужная перегрузка метода &lt;b&gt;SayHelloInternal&lt;/b&gt; будет определяться не при компиляции, а на этапе выполнения, благодаря тому что передаваемый параметр помечен как &lt;b&gt;dynamic&lt;/b&gt;.&lt;br /&gt;Теперь выполнив код, получим ожидаемый результат:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_pkXux0Jk51I/S3nFeHyPnmI/AAAAAAAACew/1b8nsua0fOI/s1600-h/EM2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_pkXux0Jk51I/S3nFeHyPnmI/AAAAAAAACew/1b8nsua0fOI/s320/EM2.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-6042091577845448841?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/6042091577845448841/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/02/blog-post.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/6042091577845448841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/6042091577845448841'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/02/blog-post.html' title='И снова о методах-расширениях'/><author><name>algel</name><uri>http://www.blogger.com/profile/01266074436759408164</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_pkXux0Jk51I/S3m7kb8oWnI/AAAAAAAACek/YsEtYHogwx0/s72-c/EM1.PNG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-7232371970245894331</id><published>2010-02-15T12:38:00.000+03:00</published><updated>2010-02-15T12:38:50.465+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='patterns and practices'/><category scheme='http://www.blogger.com/atom/ns#' term='Литература'/><title type='text'>Application Architecture Guide 2.0 на русском!!!</title><content type='html'>Опубликован перевод книги Application Architecture Guide 2.0 от команды patterns &amp;amp; practices. Для того что бы скачать книгу нужно зарегистрироваться на сайте &lt;a href="http://apparchguide.ms/"&gt;http://apparchguide.ms&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Далее описание с сайта:&lt;br /&gt;&lt;blockquote&gt;Цель данного руководства – помочь разработчикам и архитекторам решений создавать эффективные высококачественные приложения на платформе Microsoft и .NET Framework в более сжатые сроки и с меньшими рисками благодаря использованию проверенных и снискавших доверие архитектурных принципов и шаблонов проектирования.&lt;br /&gt;В руководстве предлагается обзор основных принципов и шаблонов,&lt;br /&gt;которые обеспечивают прочную базу для создания хорошей архитектуры и дизайна&lt;br /&gt;приложения. В дополнение к этой базе даются общеприменимые рекомендации по&lt;br /&gt;разделению функциональности приложения на слои, компоненты и сервисы. Далее приводятся советы по определению и реализации ключевых характеристик дизайна, основных атрибутов качества (таких как производительность, безопасность и масштабируемость) и сквозной функциональности (такой как кэширование и протоколирование). В завершение руководство предлагает рекомендации по архитектуре и дизайну наиболее общих типов приложений, таких как Веб-приложения, насыщенные Интернет-приложения (RIA), насыщенные клиентские приложения, сервисы и мобильные приложения.&lt;br /&gt;&lt;br /&gt;Руководство разделено на части соответственно основным аспектам архитектуры и дизайна. Оно скомпоновано таким образом, чтобы могло использоваться и как справочник, и как учебное пособие.&lt;br /&gt;&lt;br /&gt;Данное руководство поможет:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Понять базовые принципы и шаблоны построения архитектуры и дизайна для разработки успешных решений на платформе Microsoft.&lt;/li&gt;&lt;li&gt;Правильно выбрать стратегии и шаблоны проектирования, которые помогут при проектировании слоев, компонентов и сервисов решения.&lt;/li&gt;&lt;li&gt;Определить и реализовать ключевые технические решения.&lt;/li&gt;&lt;li&gt;Определить и реализовать основные показатели качества и сквозные функции для решения.&lt;/li&gt;&lt;li&gt;Правильно выбрать технологии для реализации решения.&lt;/li&gt;&lt;li&gt;Создать возможный вариант базовой архитектуры решения.&lt;/li&gt;&lt;li&gt;Правильно выбрать предлагаемые группой patterns &amp;amp; practices решения и руководства, которые помогут в реализации решения.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;Себе я уже скачал =)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-7232371970245894331?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/7232371970245894331/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/02/application-architecture-guide-20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/7232371970245894331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/7232371970245894331'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/02/application-architecture-guide-20.html' title='Application Architecture Guide 2.0 на русском!!!'/><author><name>algel</name><uri>http://www.blogger.com/profile/01266074436759408164</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-6056620930093965899</id><published>2010-01-31T23:41:00.000+03:00</published><updated>2010-01-31T23:41:37.842+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sync Framework'/><title type='text'>Изучаю Microsoft Sync Framework. Окончание.</title><content type='html'>В предыдущих заметках о SyncFramework ( &lt;a href="http://alexey-algel.blogspot.com/2010/01/microsoft-sync-framework_15.html"&gt;ч.1&lt;/a&gt;&amp;nbsp; &lt;a href="http://alexey-algel.blogspot.com/2010/01/microsoft-sync-framework_16.html"&gt;ч.2&lt;/a&gt;&amp;nbsp; &lt;a href="http://alexey-algel.blogspot.com/2010/01/microsoft-sync-framework_20.html"&gt;ч.3&lt;/a&gt; ) была рассмотрена синхронизация загрузкой. Этот вид синхронизации подходит когда само приложение только читает данные из БД, и не вносит никаких изменений.&lt;br /&gt;Особенностью этого способа является то, что загружаются только изменения данных произошедшие с момента последней синхронизации, в отличие от синхронизации снимком, при которой вся таблица считывается целиком.&lt;br /&gt;Но что если наше приложение должно не только считывать данные, но и вносить свои изменения? Оказывается у нас уже есть все необходимое для этого!&lt;br /&gt;Все что нужно сделать это присвоить свойству &lt;b&gt;SyncDirection&lt;/b&gt; у переменных &lt;b&gt;StuffSyncAgent.stuffTable&lt;/b&gt; и &lt;b&gt;ServerStuffSyncProvider.stuffAdapterBuilder&lt;/b&gt; значение &lt;b&gt;SyncDirection.Bidirectional&lt;/b&gt;&amp;nbsp; и все! Исходный код приводить не буду, поскольку изменения минимальны.&lt;br /&gt;На самом деле тут может возникнуть проблема с конфликтом значений первичного ключа, но я ее решил изменив тип поля на &lt;b&gt;uniqueidentifier&lt;/b&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-6056620930093965899?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/6056620930093965899/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/01/microsoft-sync-framework_31.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/6056620930093965899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/6056620930093965899'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/01/microsoft-sync-framework_31.html' title='Изучаю Microsoft Sync Framework. Окончание.'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-2918962241719551619</id><published>2010-01-28T23:36:00.000+03:00</published><updated>2010-01-28T23:36:46.055+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extension methods'/><category scheme='http://www.blogger.com/atom/ns#' term='ADO.NET'/><title type='text'>Пополняем коллекцию extension methods</title><content type='html'>Сегодня, в процессе работы, родилась еще парочка Extension methods:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/5082/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/5082/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;public static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IDbDataParameter&lt;/span&gt; CreateParameter(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IDbCommand&lt;/span&gt; command, &lt;span style="color: blue;"&gt;string&lt;/span&gt; name, &lt;span style="color: #2b91af;"&gt;DbType&lt;/span&gt; type, &lt;span style="color: blue;"&gt;object value&lt;/span&gt;) {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt; parameter = command.CreateParameter();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parameter.&lt;span style="color: #2b91af;"&gt;DbType&lt;/span&gt; = type;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parameter.ParameterName = name;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parameter.Value = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; parameter;&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;public static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IDbCommand&lt;/span&gt; CreateCommand(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IDbConnection&lt;/span&gt; conn, &lt;span style="color: blue;"&gt;string&lt;/span&gt; commandText, &lt;span style="color: #2b91af;"&gt;IDbTransaction&lt;/span&gt; transaction) {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt; command = conn.CreateCommand();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;command.CommandText = commandText;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;command.Transaction = transaction;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; command;&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;public static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IDbCommand&lt;/span&gt; CreateCommand(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IDbConnection&lt;/span&gt; conn, &lt;span style="color: blue;"&gt;string&lt;/span&gt; commandText) {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; conn.CreateCommand(commandText, &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;С ними получается несколько удобнее писать в database independent стиле. А именно вместо:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/5085/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/5085/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;public static int&lt;/span&gt; GetCountStuffByDepartment(&lt;span style="color: #2b91af;"&gt;IDbConnection&lt;/span&gt; connection, &lt;span style="color: blue;"&gt;int&lt;/span&gt; depadtmentId) {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt; command = connection.CreateCommand();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;command.CommandText = &lt;span style="color: #a31515;"&gt;"Select&amp;nbsp;Count(*)&amp;nbsp;from&amp;nbsp;Stuff&amp;nbsp;Where&amp;nbsp;DepartmentId&amp;nbsp;=&amp;nbsp;@DepartmentId"&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt; param = command.CreateParameter();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;param.DbType = DbType.&lt;span style="color: #2b91af;"&gt;Int32&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;param.ParameterName = &lt;span style="color: #a31515;"&gt;"DepartmentId"&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;param.Value = depadtmentId;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;command.Parameters.Add(param);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: blue;"&gt;int&lt;/span&gt;) command.ExecuteScalar();&lt;/li&gt;&lt;li&gt;} &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;можно написать более лаконично:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/5086/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/5086/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;public static int&lt;/span&gt; GetCountStuffByDepartment2(&lt;span style="color: #2b91af;"&gt;IDbConnection&lt;/span&gt; connection, &lt;span style="color: blue;"&gt;int&lt;/span&gt; depadtmentId) {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt; command = connection.CreateCommand(&lt;span style="color: #a31515;"&gt;"Select&amp;nbsp;Count(*)&amp;nbsp;from&amp;nbsp;Stuff&amp;nbsp;Where&amp;nbsp;DepartmentId&amp;nbsp;=&amp;nbsp;@DepartmentId"&lt;/span&gt;);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;command.Parameters.Add(command.CreateParameter(&lt;span style="color: #a31515;"&gt;"DepartmentId"&lt;/span&gt;, DbType.&lt;span style="color: #2b91af;"&gt;Int32&lt;/span&gt;, depadtmentId));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: blue;"&gt;int&lt;/span&gt;)command.ExecuteScalar();&lt;/li&gt;&lt;li&gt;} &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-2918962241719551619?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/2918962241719551619/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/01/extension-methods.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/2918962241719551619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/2918962241719551619'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/01/extension-methods.html' title='Пополняем коллекцию extension methods'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-6351479663059389813</id><published>2010-01-26T23:52:00.000+03:00</published><updated>2010-01-26T23:52:27.529+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DataBase'/><category scheme='http://www.blogger.com/atom/ns#' term='Sync Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Мысли вслух'/><title type='text'>Компромиссная разработка.</title><content type='html'>Разрабатывая маленький проект для изучения работы Sync Framework постоянно приходится искать компромисс между задуманным и тем что позволяют делать имеющиеся инструменты.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Изначально в качестве локальной БД я хотел использовать SQLite. Просто как-то привык больше с ним работать. И возможностей в нем побольше чем у SQL Server Compact, и Entity Framework и ним неплохо работает... Но, к сожалению, для него нет нормального провайдера синхронизации... А тот что есть использует в качестве меток только значения типа &lt;b&gt;Timestamp&lt;/b&gt;. Но я не хочу использовать &lt;b&gt;timestamp&lt;/b&gt;, по мне так приятнее и удобнее пользоваться типом &lt;b&gt;datetime&lt;/b&gt;.&lt;br /&gt;Ладно, поменял SQLite на SQL Server Compact, вроде все отлично. Схема таблицы нормально переносится из основной базы в локальную, правда с некоторыми ограничениями... Например &lt;b&gt;Foreign Key&lt;/b&gt; автоматически не переносится.., но можно вмешаться в процесс создания схемы, и внести свои правки. Хорошо! Добавляю вручную связку между полями &lt;b&gt;Id&lt;/b&gt; и&lt;b&gt; ParentId&lt;/b&gt; и... Все благополучно падает с сообщением о том, что в SQL Server Compact поле не может ссылаться на поле из той же таблицы... (SQLite такое вполне позволяет)&lt;br /&gt;Ок. Поскольку для доступа к данным используется EF, то дополнил класс &lt;b&gt;Stuff &lt;/b&gt;свойством &lt;b&gt;Parent&lt;/b&gt;, в котором по первому требованию пытаюсь получить руководителя запросом по ключу через &lt;b&gt;ParentId&lt;/b&gt;.&lt;br /&gt;Далее в качестве первичного ключа у меня используется &lt;b&gt;Int &lt;/b&gt;с включенным &lt;b&gt;Identity&lt;/b&gt;. В настройках мэппинга свойство &lt;b&gt;StoreGeneratedPattern &lt;/b&gt;установил в &lt;b&gt;Identity&lt;/b&gt;. Компилирую, синхронизирую - все работает. Пытаюсь добавить новую запись - валится с сообщением о том, что EF провайдер для базы данных SQL Server Compact не поддерживает значения полей генерируемые сервером. Стал искать почему, и выяснилось, что просто-напросто SQL Server Compact не поддерживает пакетные задания... То есть нельзя вставить запись и получить значение &lt;b&gt;Id &lt;/b&gt;в одном запросе. Но, возможно, в следующей версии Entity Framework эту проблему решат, путем выполнения для вставки записи двух запросов... (В SQLite такой проблемы нет.)&lt;br /&gt;Получается дальше есть два пути:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;генерация какого-то своего значения &lt;b&gt;Id&lt;/b&gt;, добавление собственной логики вставки записей в таблицу на сервере, и, скорей всего, шаманства с меткой, что бы добавленные записи с сгенеренными &lt;b&gt;Id &lt;/b&gt;перечитались с сервера обратно в локальную базу.&lt;/li&gt;&lt;li&gt;использовать в качестве первичного ключа &lt;b&gt;Guid&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;Guid &lt;/b&gt;занимает больше места, зато нет проблем с совпадением значений.&lt;br /&gt;И, почему-то мне кажется, что лучше переписать проект с использованием &lt;b&gt;Guid&lt;/b&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-6351479663059389813?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/6351479663059389813/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/01/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/6351479663059389813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/6351479663059389813'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/01/blog-post.html' title='Компромиссная разработка.'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-289216958769944047</id><published>2010-01-24T23:10:00.001+03:00</published><updated>2010-03-20T19:41:58.543+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Флот'/><title type='text'>Волго-Дон 5074</title><content type='html'>&lt;div style="text-align: center"&gt;&lt;a href="http://photofile.ru/users/_nikolsky_/3377463/77787081/"&gt;&lt;img border="0" src="http://photofile.ru/photo/_nikolsky_/3377463/large/77787081.jpg" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;/div&gt;  &lt;p&gt;Когда-то давно я работал на речном флоте. На самом деле с детства мечтал стать моряком. И когда вырос, почти сумел воплотить свою мечту в реальность. На море, правда, не попал, но успел по бороздить такие реки как Волга, Кама, Москва-река, Нева, Шексна, Волго-Балтийский канал, канал имени Москвы. По образованию я штурман. Но за пять лет работы на флоте пришло понимание, что это не мое… Видать к тому времени достаточную силу набрала другая страсть – компьютеры… Тогда я и решил сменить профиль. Уволился с работы и устроился в первую попавшуюся организацию, деятельность которой была связана с компьютерами…&lt;/p&gt;  &lt;p&gt;Прошло восемь лет, за которые я успел пройти путь от ведущего специалиста отдела сервиса (практически курьера) до начальника программного отдела (по факту ведущего программиста с доп. административными полномочиями).&lt;/p&gt;  &lt;p&gt;А вчера, с удивлением, обнаружил в сети коллекцию фотографий и видео с судна, на котором я раньше работал... &lt;a href="http://photofile.ru/users/_nikolsky_/"&gt;Автор&lt;/a&gt;, спасибо тебе большое!!!  &lt;/p&gt; &lt;a name='more'&gt;&lt;/a&gt; &lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em" href="http://1.bp.blogspot.com/_pkXux0Jk51I/S1y_fm80hZI/AAAAAAAACTM/jJRE-RV5ZEA/s1600-h/139397116.jpg" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_pkXux0Jk51I/S1y_fm80hZI/AAAAAAAACTM/jJRE-RV5ZEA/s640/139397116.jpg" width="640" height="424" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;/div&gt;  &lt;br /&gt;Даже едва ностальгия не накатила. На этом самом судне я когда-то отработал почти полторы навигации. Эх.. В основном возили удобрения из Череповца в Питер, но иногда попадались рейсы в Москву и в Соликамск (практически начало Камы, там до истока километров 60 оставалось).  &lt;br /&gt;  &lt;br /&gt;  &lt;div style="text-align: center"&gt;&lt;a href="http://photofile.ru/users/_nikolsky_/3597897/79142180/"&gt;&lt;img border="0" src="http://photofile.ru/photo/_nikolsky_/3597897/large/79142180.jpg" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;/div&gt;  &lt;br /&gt;Иногда и щебенку возили из Питкяранты или из Ровного (северная часть Ладожского озера)  &lt;br /&gt;  &lt;br /&gt;  &lt;div style="text-align: center"&gt;&lt;a href="http://photofile.ru/users/_nikolsky_/3377463/81142171/"&gt;&lt;img border="0" src="http://photofile.ru/photo/_nikolsky_/3377463/large/81142171.jpg" /&gt;&lt;/a&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://photofile.ru/users/_nikolsky_/3377463/77407330/"&gt;&lt;img border="0" src="http://photofile.ru/photo/_nikolsky_/3377463/large/77407330.jpg" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;/div&gt;  &lt;br /&gt;И даже в аварию попадали на нем. Столкнулись нос в нос с другим судном в тумане на Волго-Балтийском канале...  &lt;br /&gt;  &lt;br /&gt;  &lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em" href="http://1.bp.blogspot.com/_pkXux0Jk51I/S1yiQuLU79I/AAAAAAAACTA/NuDV8A6sLMA/s1600-h/000829_BivaetITak.jpg" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_pkXux0Jk51I/S1yiQuLU79I/AAAAAAAACTA/NuDV8A6sLMA/s320/000829_BivaetITak.jpg" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;/div&gt;  &lt;br /&gt;Мы тогда как раз из Соликамска возвращались, и на Волго-Балтийском канале под утро накрыло туманом. Сменный капитан решил не вставать на якорь, а пройти эту полосу тумана с помощью локатора. Похоже, что тот встречный рассуждал примерно так же.... В объяснительных экипажи обоих судов написали что во время столкновения у обоих были отданы якоря, и оба судна двигались назад.  &lt;br /&gt;Судоходный инспектор тогда произнес отличную фразу: &amp;quot;Ребята! Здесь днем с огнем ходить надо. А вы в тумане с локатором полезли...&amp;quot;. Получается что хотели сэкономить час-другой, на ожидании пока туман рассеется, а в результате потеряли порядка 3000$ (премия за безаварийный рейс в срок), и две недели ушло на ремонт.  &lt;br /&gt;Сменный капитан через месяц стал рулевым-мотористом... На сколько я помню, кроме него, никто по этому поводу особо не расстроился. А весь рядовой состав был просто счастлив! Не любили его в общем.  &lt;br /&gt;  &lt;br /&gt;Ну и несколько роликов напоследок:  &lt;br /&gt;  &lt;br /&gt;&lt;b&gt;Подход к причалу и швартовка в п. Вознесенье&lt;/b&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;div style="text-align: center"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2DF-Cfq0iXk&amp;amp;hl=ru_RU&amp;amp;fs=1&amp;amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/2DF-Cfq0iXk&amp;amp;hl=ru_RU&amp;amp;fs=1&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;br /&gt;&lt;/div&gt;  &lt;br /&gt;&lt;b&gt;Заход в 4-й шлюз на Волго-Балтийском канале&lt;/b&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;div style="text-align: center"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/mhQLRGN0QJs&amp;amp;hl=ru_RU&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/mhQLRGN0QJs&amp;amp;hl=ru_RU&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;br /&gt;&lt;/div&gt; &lt;a href="http://photofile.ru/users/_nikolsky_/"&gt;Автору&lt;/a&gt; еще раз респект и уважуха! =)    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-289216958769944047?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/289216958769944047/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/01/5074.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/289216958769944047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/289216958769944047'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/01/5074.html' title='Волго-Дон 5074'/><author><name>algel</name><uri>http://www.blogger.com/profile/01266074436759408164</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_pkXux0Jk51I/S1y_fm80hZI/AAAAAAAACTM/jJRE-RV5ZEA/s72-c/139397116.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-2020439175088812209</id><published>2010-01-20T23:43:00.002+03:00</published><updated>2010-02-09T15:50:58.464+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sync Framework'/><title type='text'>Изучаю Microsoft Sync Framework. Клиент.</title><content type='html'>Итак. Слой доступа к данным, как я говорил ранее, реализован спомощью Entity Framework. Собственно описывать тут особо нечего, большая часть кода генерируется автоматически.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_pkXux0Jk51I/S3FaDe-P8vI/AAAAAAAACcg/s53nB_AT65E/s1600-h/Capture.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_pkXux0Jk51I/S3FaDe-P8vI/AAAAAAAACcg/s53nB_AT65E/s320/Capture.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;После работы мастера, у меня появилось два класса:&lt;br /&gt;&lt;b&gt;PhoneRefEntities&lt;/b&gt; - наследник от&lt;b&gt; System.Data.Objects.ObjectContext&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Stuff&lt;/b&gt; - наследник от&lt;b&gt; System.Data.Objects.DataClasses.EntityObject&lt;/b&gt;&lt;br /&gt;Для удобства немного расширил класс PhoneRefEntities, добавив в него статическое свойство Instance:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/4806/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/4806/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; PhoneRef.Data {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;partial class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PhoneRefEntities&lt;/span&gt; {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PhoneRefEntities&lt;/span&gt; _instance;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private static readonly object&lt;/span&gt; SyncRoot = &lt;span style="color: blue;"&gt;new object&lt;/span&gt;();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PhoneRefEntities&lt;/span&gt; Instance {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt; {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;lock&lt;/span&gt; (SyncRoot) {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (_instance == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_instance = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PhoneRefEntities&lt;/span&gt;();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; _instance;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;} &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Sql Server Compact не позволяет создавать связи внутри одной таблицы, поэтому свойство &lt;b&gt;Parent&lt;/b&gt; тоже пришлось реализовать вручную:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/4808/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/4808/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; Stuff _parent;&lt;/li&gt;&lt;li&gt;&lt;span style="color: green;"&gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: green;"&gt;///&amp;nbsp;Руководитель&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: green;"&gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; Stuff Parent {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt; {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//SQL&amp;nbsp;Server&amp;nbsp;Compact&amp;nbsp;не&amp;nbsp;позволяет&amp;nbsp;создавать&amp;nbsp;связки&amp;nbsp;на&amp;nbsp;внутри&amp;nbsp;одной&amp;nbsp;таблицы&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;поэтому&amp;nbsp;реализуем&amp;nbsp;ее&amp;nbsp;таким&amp;nbsp;образом.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; _parent ??&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(_parent = PhoneRefEntities.Instance.Stuff.FirstOrDefault(item =&amp;gt; item.Id == ParentId));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt; {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;value&lt;/span&gt; == &lt;span style="color: blue;"&gt;null&lt;/span&gt;) ParentId = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt; ParentId = &lt;span style="color: blue;"&gt;value&lt;/span&gt;.Id;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;partial void&lt;/span&gt; OnParentIdChanged() {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_parent = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;} &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Пользовательский интерфейс будет состоять из одной формы и иконки в панели уведомлений. Форма будет отображаться и скрываться при клике на иконку, и обеспечивать простейший поиск нужного сотрудника по фамилии, и отображение информации по выбранному сотруднику.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_acCthH_ISgQ/S1YgDWhe79I/AAAAAAAAABo/ZIPkXAaa4R8/s1600-h/2010-01-19_165326.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_acCthH_ISgQ/S1YgDWhe79I/AAAAAAAAABo/ZIPkXAaa4R8/s320/2010-01-19_165326.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_acCthH_ISgQ/S1YgFhK69QI/AAAAAAAAABw/ORvM9H5ztJU/s1600-h/2010-01-19_165401.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_acCthH_ISgQ/S1YgFhK69QI/AAAAAAAAABw/ORvM9H5ztJU/s320/2010-01-19_165401.png" /&gt;&lt;/a&gt;&lt;/div&gt;Исходный код примера можно &lt;a href="http://cid-2e1ae6b85e4d813f.skydrive.live.com/self.aspx/.Public/PhoneRef.zip"&gt;скачать здесь.&lt;/a&gt; Вкратце после инициализации привязок, в конструкторе формы, пытаемся считать данные из локальной БД, вызвав метод &lt;b&gt;RefreshDataSource()&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/4809/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/4809/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;private void&lt;/span&gt; RefreshDataSource() {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (_entityes == &lt;span style="color: blue;"&gt;null&lt;/span&gt;) _entityes = PhoneRefEntities.Instance;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//Нужно&amp;nbsp;для&amp;nbsp;того&amp;nbsp;чтобы&amp;nbsp;возвратились&amp;nbsp;данные&amp;nbsp;из&amp;nbsp;локальной&amp;nbsp;БД,&amp;nbsp;а&amp;nbsp;не&amp;nbsp;из&amp;nbsp;кэша&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_entityes.Refresh(System.Data.Objects.RefreshMode.StoreWins, _entityes.Stuff);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_bs.DataSource = (&lt;span style="color: blue;"&gt;from&lt;/span&gt; stuff &lt;span style="color: blue;"&gt;in&lt;/span&gt; _entityes.Stuff&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;orderby&lt;/span&gt; stuff.LastName&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;select&lt;/span&gt; stuff).ToList();&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;Если локальная БД еще ни разу не синхронизировалась с сервером, то возникнет исключение &lt;b&gt;EntityCommandExecutionException&lt;/b&gt;. В этом случае пытаемся провести синхронизацию, и еще раз перечитать данные.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/4810/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/4810/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;private void&lt;/span&gt; SynchronizeAndRefresh() {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;try&lt;/span&gt; {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data.Synchronization.SyncHelper.Synchronize();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RefreshDataSource();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: blue;"&gt;catch&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Exception&lt;/span&gt; e) {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Trace.WriteLine(e);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;Ну и в дальнейшем настраиваем таймер таким образом что бы каждую минуту вызывался метод &lt;b&gt;SynchronizeAndRefresh()&lt;/b&gt;. Теперь если изменить данные на сервере, то в течение минуты (разумеется при наличии связи с сервером) эти изменения окажутся на клиенте.&lt;br /&gt;Итого первая цель достигнута. А именно у нас есть работающее приложение способное работать в offline-режиме, и умеющее автоматически синхронизировать локальную БД с сервером, при наличии связи.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-2020439175088812209?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/2020439175088812209/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/01/microsoft-sync-framework_20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/2020439175088812209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/2020439175088812209'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/01/microsoft-sync-framework_20.html' title='Изучаю Microsoft Sync Framework. Клиент.'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_pkXux0Jk51I/S3FaDe-P8vI/AAAAAAAACcg/s53nB_AT65E/s72-c/Capture.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-3984967095065750274</id><published>2010-01-16T01:02:00.010+03:00</published><updated>2010-01-16T18:54:55.534+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sync Framework'/><title type='text'>Изучаю Microsoft Sync Framework. Модуль синхронизации.</title><content type='html'>Для того что бы иметь возможность синхронизировать данные на клиенте, нам потребуется реализовать три класса:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;ClientStuffSyncProvider&lt;/span&gt; - провайдер для локальной базы. &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;ServerStuffSyncProvider&lt;/span&gt; - провайдер для удаленной базы.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;StuffSyncAgent&lt;/span&gt; - руководит синхронизацией.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;ClientStuffSysncProvider&lt;/span&gt; унаследван от класса &lt;a href="http://msdn.microsoft.com/ru-ru/library/bb726110%28SQL.105%29.aspx"&gt;&lt;span style="font-style: italic;"&gt;Microsoft.Synchronization.Data.SqlServerCe.SqlCeClientSyncProvider&lt;/span&gt;&lt;/a&gt; и предназначен для решения задач синхронизации на стороне клиента, используя базу данных SQL Server Compact. Конкретно он делает следующее:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Сохраняет сведения о подготовленных к синхронизации таблицах на клиенте.&lt;/li&gt;&lt;li&gt;Получает изменения, которые произошли в клиентской базе данных со времени последней синхронизации.&lt;/li&gt;&lt;li&gt;Применяет добавочные изменения к клиентской базе данных.&lt;/li&gt;&lt;li&gt;Выявляет конфликтующие изменения.&lt;/li&gt;&lt;/ul&gt;В нашем случае реализация этого класса довольно простая. Все что нужно сделать - это указать параметры подключения к локальной БД.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style=";font-family:Courier New;font-size:x-small;color:black;"   &gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; Microsoft.Synchronization.Data;&lt;br /&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; Microsoft.Synchronization.Data.SqlServerCe;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; PhoneRef.Data.Synchronization {&lt;br /&gt;&lt;span style="color:blue;"&gt;internal&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; ClientStuffSyncProvider : SqlCeClientSyncProvider {&lt;br /&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; ClientStuffSyncProvider() {&lt;br /&gt;ConnectionString = System.Configuration.&lt;span style="color: rgb(43, 145, 175);"&gt;ConfigurationManager&lt;/span&gt;.ConnectionStrings[&lt;span style="color: rgb(163, 21, 21);"&gt;"LocalConnection"&lt;/span&gt;].ConnectionString;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-size:xx-small;color:grey;"  &gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style=";font-size:xx-small;color:grey;"  &gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;Также этот класс позволяет вклиниться в процесс создания схемы БД и внести дополнительные изменения, например создать внешний ключ.&lt;br /&gt;&lt;br /&gt;Класс &lt;span style="font-style: italic;"&gt;ServerStuffSyncProvider&lt;/span&gt; унаследован от  &lt;a href="http://msdn.microsoft.com/ru-ru/library/bb686883%28SQL.105%29.aspx"&gt;&lt;span style="font-style: italic;"&gt;Microsoft.Synchronization.Data.Server.DbServerSyncProvider&lt;/span&gt;&lt;/a&gt; и делает следующее:&lt;br /&gt;&lt;span&gt;&lt;ul&gt;&lt;li&gt;Сохраняет сведения о подготовленных к синхронизации таблицах на сервере.&lt;/li&gt;&lt;li&gt;Позволяет приложениям получать изменения, которые произошли в базе данных сервера со времени последней синхронизации.&lt;/li&gt;&lt;li&gt;Применяет добавочные изменения к базе данных сервера.&lt;/li&gt;&lt;li&gt;Выявляет конфликтующие изменения.&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;Именно в этом классе определяется какие таблицы подлежат синхронизации. Какой вид синхронизации для них использовать. А также можно определить запросы для получения добавленных, измененных и удаленных записей. И в нем же можно определить запросы для обновления данных на сервере.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style=";font-family:Courier New;font-size:85%;color:black;"   &gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System.Data;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System.Data.SqlClient;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; Microsoft.Synchronization.Data;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; Microsoft.Synchronization.Data.Server;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; System.Configuration;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;namespace&lt;/span&gt; PhoneRef.Data.Synchronization {&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;internal&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; ServerStuffSyncProvider : DbServerSyncProvider {&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; ServerStuffSyncProvider() {&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; conn =&lt;br /&gt;          &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SqlConnection(&lt;span style="color: rgb(43, 145, 175);"&gt;ConfigurationManager&lt;/span&gt;.ConnectionStrings[&lt;span style="color: rgb(163, 21, 21);"&gt;"ServerConnection"&lt;/span&gt;].ConnectionString);&lt;br /&gt;      Connection = conn;&lt;br /&gt;      &lt;span style="color: rgb(0, 128, 0);"&gt;//Определяем запрос для получения нового значения метки&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 128, 0);"&gt;//которая будет использоваться в дальнейшем для определения&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 128, 0);"&gt;//записей измененных с последнего сеанса синхронизации.&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 128, 0);"&gt;//Поскольку мы определили поля InsertDate, UpdateDate и DeleteDate с типом DateTime&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 128, 0);"&gt;//то в качестве метки будем использовать значение текущей даты на сервере.&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; selectNewAnchorCommand = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SqlCommand&lt;/span&gt;();&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;const&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; newAnchorVariable = &lt;span style="color: rgb(163, 21, 21);"&gt;"@"&lt;/span&gt; + SyncSession.SyncNewReceivedAnchor;&lt;br /&gt;      selectNewAnchorCommand.CommandText = &lt;span style="color: rgb(163, 21, 21);"&gt;"SELECT "&lt;/span&gt; + newAnchorVariable + &lt;span style="color: rgb(163, 21, 21);"&gt;" = GETDATE()"&lt;/span&gt;;&lt;br /&gt;      selectNewAnchorCommand.Parameters.Add(newAnchorVariable, SqlDbType.&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;);&lt;br /&gt;      selectNewAnchorCommand.Parameters[newAnchorVariable].Direction = ParameterDirection.Output;&lt;br /&gt;      selectNewAnchorCommand.Connection = conn;&lt;br /&gt;      SelectNewAnchorCommand = selectNewAnchorCommand;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 128, 0);"&gt;//Создаем и настраиваем адаптер для каждой синхронизируемой таблицы&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 128, 0);"&gt;//В нашем случае она одна.&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; stuffAdapterBuilder = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SqlSyncAdapterBuilder(conn)&lt;br /&gt;      {&lt;br /&gt;          SyncDirection = SyncDirection.DownloadOnly,&lt;br /&gt;          TableName = &lt;span style="color: rgb(163, 21, 21);"&gt;"dbo.Stuff"&lt;/span&gt;,&lt;br /&gt;          TombstoneTableName = &lt;span style="color: rgb(163, 21, 21);"&gt;"dbo.Stuff_Tombstone"&lt;/span&gt;,&lt;br /&gt;          CreationTrackingColumn = &lt;span style="color: rgb(163, 21, 21);"&gt;"InsertDate"&lt;/span&gt;,&lt;br /&gt;          UpdateTrackingColumn = &lt;span style="color: rgb(163, 21, 21);"&gt;"UpdateDate"&lt;/span&gt;&lt;br /&gt;      };&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; stuffSyncAdapter = stuffAdapterBuilder.ToSyncAdapter(&lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;);&lt;br /&gt;      stuffSyncAdapter.TableName = StuffSyncAgent.StuffTableName;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 128, 0);"&gt;//Команда для получения новых записей с сервера.&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; stuffIncrInserts = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SqlCommand&lt;/span&gt;();&lt;br /&gt;      stuffIncrInserts.CommandText = &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;.Format(&lt;span style="color: rgb(163, 21, 21);"&gt;@"&lt;br /&gt;SELECT Id, ParentId, LastName, FirstName, SecondName, Division, Position, Phone&lt;br /&gt;FROM dbo.Stuff&lt;br /&gt;WHERE (InsertDate &gt; @{0}&lt;br /&gt;AND InsertDate &lt;= @{1})"&lt;/span&gt;,&lt;br /&gt;                      SyncSession.SyncLastReceivedAnchor, SyncSession.SyncNewReceivedAnchor);&lt;br /&gt;&lt;br /&gt;      stuffIncrInserts.Parameters.Add(&lt;span style="color: rgb(163, 21, 21);"&gt;"@"&lt;/span&gt; + SyncSession.SyncLastReceivedAnchor, SqlDbType.&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;);&lt;br /&gt;      stuffIncrInserts.Parameters.Add(&lt;span style="color: rgb(163, 21, 21);"&gt;"@"&lt;/span&gt; + SyncSession.SyncNewReceivedAnchor, SqlDbType.&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;);&lt;br /&gt;      stuffIncrInserts.Connection = conn;&lt;br /&gt;      stuffSyncAdapter.SelectIncrementalInsertsCommand = stuffIncrInserts;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 128, 0);"&gt;//Получение измененных записей с сервера.&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; stuffIncrUpdates = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SqlCommand&lt;/span&gt;();&lt;br /&gt;      stuffIncrUpdates.CommandText = &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;.Format(&lt;span style="color: rgb(163, 21, 21);"&gt;@"&lt;br /&gt;SELECT Id, ParentId, LastName, FirstName, SecondName, Division, Position, Phone&lt;br /&gt;FROM dbo.Stuff&lt;br /&gt;WHERE (UpdateDate &gt; @{0} AND UpdateDate &lt;= @{1})"&lt;/span&gt;,&lt;br /&gt;                      SyncSession.SyncLastReceivedAnchor, SyncSession.SyncNewReceivedAnchor); ;&lt;br /&gt;      stuffIncrUpdates.Parameters.Add(&lt;span style="color: rgb(163, 21, 21);"&gt;"@"&lt;/span&gt; + SyncSession.SyncLastReceivedAnchor, SqlDbType.&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;);&lt;br /&gt;      stuffIncrUpdates.Parameters.Add(&lt;span style="color: rgb(163, 21, 21);"&gt;"@"&lt;/span&gt; + SyncSession.SyncNewReceivedAnchor, SqlDbType.&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;);&lt;br /&gt;      stuffIncrUpdates.Connection = conn;&lt;br /&gt;      stuffSyncAdapter.SelectIncrementalUpdatesCommand = stuffIncrUpdates;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 128, 0);"&gt;//Получение удаленных записей с сервера.&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; stuffIncrDeletes = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;SqlCommand&lt;/span&gt;();&lt;br /&gt;      stuffIncrDeletes.CommandText = &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;.Format(&lt;span style="color: rgb(163, 21, 21);"&gt;@"&lt;br /&gt;SELECT Id, ParentId, LastName, FirstName, SecondName, Division, Position, Phone&lt;br /&gt;FROM dbo.Stuff_Tombstone&lt;br /&gt;WHERE (@{0} = 1&lt;br /&gt;AND DeleteDate &gt; @{1}&lt;br /&gt;AND DeleteDate &lt;= @{2})"&lt;/span&gt;,&lt;br /&gt;                      SyncSession.SyncInitialized, SyncSession.SyncLastReceivedAnchor, SyncSession.SyncNewReceivedAnchor);&lt;br /&gt;      stuffIncrDeletes.Parameters.Add(&lt;span style="color: rgb(163, 21, 21);"&gt;"@"&lt;/span&gt; + SyncSession.SyncInitialized, SqlDbType.Bit);&lt;br /&gt;      stuffIncrDeletes.Parameters.Add(&lt;span style="color: rgb(163, 21, 21);"&gt;"@"&lt;/span&gt; + SyncSession.SyncLastReceivedAnchor, SqlDbType.&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;);&lt;br /&gt;      stuffIncrDeletes.Parameters.Add(&lt;span style="color: rgb(163, 21, 21);"&gt;"@"&lt;/span&gt; + SyncSession.SyncNewReceivedAnchor, SqlDbType.&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;);&lt;br /&gt;      stuffIncrDeletes.Connection = conn;&lt;br /&gt;      stuffSyncAdapter.SelectIncrementalDeletesCommand = stuffIncrDeletes;&lt;br /&gt;&lt;br /&gt;      SyncAdapters.Add(stuffSyncAdapter);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-size:78%;color:gray;"  &gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style=";font-size:78%;color:gray;"  &gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;Теперь осталось создать клас, который будет руководить процессом синхронизации.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;StuffSyncAgent&lt;/span&gt; наследуем от &lt;a style="font-style: italic;" href="http://msdn.microsoft.com/ru-ru/library/bb734510%28SQL.105%29.aspx"&gt;Microsoft.Synchronization.SyncAgent&lt;/a&gt;.&lt;br /&gt;В нем задаем описанные выше провайдеры, и определяем таблицы подлежащие синхронизации. Казалось бы зачем еще раз их определять, ведь мы это уже делали в классе &lt;span style="font-style: italic;"&gt;ServerStuffSyncProvider&lt;/span&gt;? А вот зачем, в серверном провайдере мы определили то каким образом можно синхронизировать определенные таблицы. А здесь мы указываем какие из таблиц поддерживаемых провайдером нужно синхронизировать, и какой вид синхронизации использовать для каждой.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style=";font-family:Courier New;font-size:85%;color:black;"   &gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; Microsoft.Synchronization;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt; Microsoft.Synchronization.Data;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;namespace&lt;/span&gt; PhoneRef.Data.Synchronization {&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; StuffSyncAgent : SyncAgent {&lt;br /&gt;   &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;const&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; StuffTableName = &lt;span style="color: rgb(163, 21, 21);"&gt;"Stuff"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; StuffSyncAgent() {&lt;br /&gt;       LocalProvider = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; ClientStuffSyncProvider();&lt;br /&gt;       RemoteProvider = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; ServerStuffSyncProvider();&lt;br /&gt;       &lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt; stuffTable = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SyncTable(StuffTableName)&lt;br /&gt;                           {&lt;br /&gt;                               CreationOption = TableCreationOption.DropExistingOrCreateNewTable,&lt;br /&gt;                               SyncDirection = SyncDirection.DownloadOnly&lt;br /&gt;                           };&lt;br /&gt;       Configuration.SyncTables.Add(stuffTable);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-size:78%;color:gray;"  &gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style=";font-size:78%;color:gray;"  &gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;Весь код описанный выше находится в отдельной сборке, в которой также будет определен слой работы с данными (для этого я решил использовать &lt;a href="http://msdn.microsoft.com/ru-ru/library/bb399572.aspx"&gt;Entity Framework&lt;/a&gt;). Для упрощения взаимодействия с этой сборкой, я написал хэлпер класс, что бы избавить модули ссылающиеся на эту сборку от подключения ссылок на дополнительные сборки.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style=";font-family:Courier New;font-size:85%;color:black;"   &gt;&lt;span style="color: rgb(0, 0, 255);"&gt;namespace&lt;/span&gt; PhoneRef.Data.Synchronization {&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; SyncHelper {&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;readonly&lt;/span&gt; StuffSyncAgent SyncAgent = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; StuffSyncAgent();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; Synchronize() {&lt;br /&gt;        SyncAgent.Synchronize();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-size:78%;color:gray;"  &gt;* This source code was highlighted with &lt;a href="http://virtser.net/blog/post/source-code-highlighter.aspx"&gt;&lt;span style=";font-size:78%;color:gray;"  &gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;Собственно приведенного выше кода вполне достаточно для того что бы создать схему данных в локальной БД (она будет создана автоматически при первой синхронизации), загрузить данные с сервера, и отслеживать изменения данных произведенных на сервере. И все это делается вызовом одного метода &lt;span style="font-weight: bold;"&gt;SyncHelper.Synchronize()&lt;/span&gt;&lt;br /&gt;Осталось реализовать слой для работы с данными и пользовательский интерфейс, но об этом в следующей заметке.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-3984967095065750274?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/3984967095065750274/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/01/microsoft-sync-framework_16.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/3984967095065750274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/3984967095065750274'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/01/microsoft-sync-framework_16.html' title='Изучаю Microsoft Sync Framework. Модуль синхронизации.'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-1164558362990783496</id><published>2010-01-15T15:15:00.010+03:00</published><updated>2010-02-09T15:41:48.664+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DataBase'/><category scheme='http://www.blogger.com/atom/ns#' term='Sync Framework'/><title type='text'>Изучаю Microsoft Sync Framework. База данных.</title><content type='html'>Ну что ж, начнем с базы данных. Для простоты все необходимые данные будем хранить в одной таблице "Stuff". Нам понадобятся 8 основных полей (Id, ParentId, LastName, FirstName, SecondName, Division, Position, Phone) и два дополнительных (InsertDate, UpdateDate), для отслеживания изменений.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;CREATE TABLE&lt;/span&gt; [dbo].[Stuff](&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Id] [uniqueidentifier] &lt;span style="color: blue;"&gt;NOT NULL rowguidcol DEFAULT&lt;/span&gt; newid(),&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ParentId] [uniqueidentifier] &lt;span style="color: blue;"&gt;NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[LastName] [nvarchar](50) &lt;span style="color: blue;"&gt;NOT NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[FirstName] [nvarchar](50) &lt;span style="color: blue;"&gt;NOT NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[SecondName] [nvarchar](50) &lt;span style="color: blue;"&gt;NOT NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Division] [nvarchar](256) &lt;span style="color: blue;"&gt;NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color: blue;"&gt;Position&lt;/span&gt;] [nvarchar](256) &lt;span style="color: blue;"&gt;NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Phone] [&lt;span style="color: blue;"&gt;smallint&lt;/span&gt;] &lt;span style="color: blue;"&gt;NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[InsertDate] [datetime] &lt;span style="color: blue;"&gt;NOT NULL CONSTRAINT&lt;/span&gt; [DF_Stuff_InsertDate]  &lt;span style="color: blue;"&gt;DEFAULT&lt;/span&gt; (getdate()),&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[UpdateDate] [datetime] &lt;span style="color: blue;"&gt;NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;CONSTRAINT&lt;/span&gt; [PK_Stuff] &lt;span style="color: blue;"&gt;PRIMARY KEY CLUSTERED&lt;/span&gt; ([Id] &lt;span style="color: blue;"&gt;ASC&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;WITH&lt;/span&gt; (PAD_INDEX  = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;, STATISTICS_NORECOMPUTE  = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;, IGNORE_DUP_KEY = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;, ALLOW_ROW_LOCKS  = &lt;span style="color: blue;"&gt;ON&lt;/span&gt;, ALLOW_PAGE_LOCKS  = &lt;span style="color: blue;"&gt;ON&lt;/span&gt;) &lt;span style="color: blue;"&gt;ON&lt;/span&gt; [&lt;span style="color: blue;"&gt;PRIMARY&lt;/span&gt;]&lt;/li&gt;&lt;li&gt;) &lt;span style="color: blue;"&gt;ON&lt;/span&gt; [&lt;span style="color: blue;"&gt;PRIMARY&lt;/span&gt;]&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;GO&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;ALTER TABLE&lt;/span&gt; [dbo].[Stuff]  &lt;span style="color: blue;"&gt;WITH CHECK ADD  CONSTRAINT&lt;/span&gt; [FK_Stuff_Stuff] &lt;span style="color: blue;"&gt;FOREIGN KEY&lt;/span&gt;([ParentId])&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;REFERENCES&lt;/span&gt; [dbo].[Stuff] ([Id])&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;GO&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;ALTER TABLE&lt;/span&gt; [dbo].[Stuff] &lt;span style="color: blue;"&gt;CHECK CONSTRAINT&lt;/span&gt; [FK_Stuff_Stuff]&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Так же нам понадобится создать таблицу для хранения удаленных записей "Stuff_Tombstone" с теми же основными полями плюс дата удаления записи (DeleteDate).&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;CREATE TABLE&lt;/span&gt; [dbo].[Stuff_Tombstone](&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Id] [uniqueidentifier] &lt;span style="color: blue;"&gt;NOT NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ParentId] [uniqueidentifier] &lt;span style="color: blue;"&gt;NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[LastName] [nvarchar](50) &lt;span style="color: blue;"&gt;NOT NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[FirstName] [nvarchar](50) &lt;span style="color: blue;"&gt;NOT NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[SecondName] [nvarchar](50) &lt;span style="color: blue;"&gt;NOT NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Division] [nvarchar](256) &lt;span style="color: blue;"&gt;NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color: blue;"&gt;Position&lt;/span&gt;] [nvarchar](256) &lt;span style="color: blue;"&gt;NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Phone] [&lt;span style="color: blue;"&gt;smallint&lt;/span&gt;] &lt;span style="color: blue;"&gt;NULL&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DeleteDate] [datetime] &lt;span style="color: blue;"&gt;NOT NULL CONSTRAINT&lt;/span&gt; [DF_Stuff_Tombstone_DeleteDate]  &lt;span style="color: blue;"&gt;DEFAULT&lt;/span&gt; (getdate()),&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;CONSTRAINT&lt;/span&gt; [PK_Stuff_Tombstone] &lt;span style="color: blue;"&gt;PRIMARY KEY CLUSTERED&lt;/span&gt; ([Id] &lt;span style="color: blue;"&gt;ASC&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;WITH&lt;/span&gt; (IGNORE_DUP_KEY = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;) &lt;span style="color: blue;"&gt;ON&lt;/span&gt; [&lt;span style="color: blue;"&gt;PRIMARY&lt;/span&gt;]) &lt;span style="color: blue;"&gt;ON&lt;/span&gt; [&lt;span style="color: blue;"&gt;PRIMARY&lt;/span&gt;]&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;GO&lt;/span&gt; &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_acCthH_ISgQ/S1BhVeKYi-I/AAAAAAAAABY/AjFxqZ-ffJQ/s1600-h/PhoneRef_DBScheme.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5426944572483210210" src="http://4.bp.blogspot.com/_acCthH_ISgQ/S1BhVeKYi-I/AAAAAAAAABY/AjFxqZ-ffJQ/s320/PhoneRef_DBScheme.PNG" style="cursor: pointer; display: block; height: 213px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Поля InsertDate, UpdateDate, DeleteDate необходимы для того, что бы при синхронизации подгружались только те данные, которые изменились со времени последней синхронизации.&lt;br /&gt;&lt;br /&gt;Теперь создадим триггеры на обновление и удаление записей из основной таблицы:&lt;br /&gt;При изменении записи будем обновлять значение поля UpdateDate&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;CREATE TRIGGER&lt;/span&gt; [dbo].[Stuff_UTrig]&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;ON&lt;/span&gt;  [dbo].[Stuff]&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;FOR UPDATE&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;AS&lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;BEGIN&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;SET&lt;/span&gt; NOCOUNT &lt;span style="color: blue;"&gt;ON&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;IF NOT UPDATE&lt;/span&gt;(UpdateDate)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;Update&lt;/span&gt; dbo.[Stuff]&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;Set&lt;/span&gt; UpdateDate = getdate()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;From&lt;/span&gt; dbo.[Stuff] S&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;join&lt;/span&gt; inserted i &lt;span style="color: blue;"&gt;on&lt;/span&gt; S.id = i.Id&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;END&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;GO&lt;/span&gt; &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;А при удалении будем копировать записи в т.н. таблицу "захоронения", что бы при синхронизации удалять эти записи из локальной БД.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;CREATE TRIGGER&lt;/span&gt; [dbo].[Stuff_DTrig] &lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;ON&lt;/span&gt;  [dbo].[Stuff]&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;FOR DELETE&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;AS&lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;BEGIN&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;SET&lt;/span&gt; NOCOUNT &lt;span style="color: blue;"&gt;ON&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;Delete from&lt;/span&gt; dbo.Stuff_Tombstone&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;Where&lt;/span&gt; Id &lt;span style="color: blue;"&gt;in&lt;/span&gt; (&lt;span style="color: blue;"&gt;Select&lt;/span&gt; id &lt;span style="color: blue;"&gt;from&lt;/span&gt; deleted)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;declare&lt;/span&gt; @delDate datetime&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;Select&lt;/span&gt; @delDate = getdate()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;Insert into&lt;/span&gt; dbo.Stuff_Tombstone(Id, ParentId, LastName, FirstName, SecondName, Division, &lt;span style="color: blue;"&gt;Position&lt;/span&gt;, Phone, DeleteDate)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;Select&lt;/span&gt; Id, ParentId, LastName, FirstName, SecondName, Division, &lt;span style="color: blue;"&gt;Position&lt;/span&gt;, Phone, @delDate&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;From&lt;/span&gt; deleted&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;END&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;GO&lt;/span&gt; &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ну и добавим еще несколько индексов, для вспомогательных полей:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;CREATE NONCLUSTERED INDEX&lt;/span&gt; [IX_Stuff_InsertDate] &lt;span style="color: blue;"&gt;ON&lt;/span&gt; [dbo].[Stuff] ([InsertDate] &lt;span style="color: blue;"&gt;DESC&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;WITH&lt;/span&gt; (SORT_IN_TEMPDB = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;, DROP_EXISTING = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;, IGNORE_DUP_KEY = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;, ONLINE = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;) &lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;ON&lt;/span&gt; [&lt;span style="color: blue;"&gt;PRIMARY&lt;/span&gt;]&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;GO&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;CREATE NONCLUSTERED INDEX&lt;/span&gt; [IX_Stuff_UpdateDate] &lt;span style="color: blue;"&gt;ON&lt;/span&gt; [dbo].[Stuff]([UpdateDate] &lt;span style="color: blue;"&gt;DESC&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;WITH&lt;/span&gt; (SORT_IN_TEMPDB = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;, DROP_EXISTING = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;, IGNORE_DUP_KEY = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;, ONLINE = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;) &lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;ON&lt;/span&gt; [&lt;span style="color: blue;"&gt;PRIMARY&lt;/span&gt;]&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;GO&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;CREATE NONCLUSTERED INDEX&lt;/span&gt; [IX_Stuff_Tombstone_DeleteDate] &lt;span style="color: blue;"&gt;ON&lt;/span&gt; [dbo].[Stuff_Tombstone] ([DeleteDate] &lt;span style="color: blue;"&gt;DESC&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;WITH&lt;/span&gt; (SORT_IN_TEMPDB = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;, DROP_EXISTING = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;, IGNORE_DUP_KEY = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;, ONLINE = &lt;span style="color: blue;"&gt;OFF&lt;/span&gt;) &lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;ON&lt;/span&gt; [&lt;span style="color: blue;"&gt;PRIMARY&lt;/span&gt;]&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;GO&lt;/span&gt; &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Собственно, необходимая структура базы готова, осталось только наполнить ее данными:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;INSERT INTO&lt;/span&gt; dbo.Stuff(Id, ParentId, LastName, FirstName, SecondName, Division, &lt;span style="color: blue;"&gt;Position&lt;/span&gt;, Phone)&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Select&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'985BF8B4-00D1-463E-9AFE-376033D476F8'&lt;/span&gt;,&lt;span style="color: blue;"&gt;null&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Иванов'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Иван'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Иванович'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'АУП'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Генеральный&amp;nbsp;директор'&lt;/span&gt;,1000&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Union Select&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'3E29A780-AB8E-4C4C-80FB-38C5A117BDE0'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'985BF8B4-00D1-463E-9AFE-376033D476F8'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Гирина'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Анна'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Константиновна'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Бухгалтерия'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Главный&amp;nbsp;бухгалтер'&lt;/span&gt;,2000&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Union Select&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'B0E8AF1F-A604-4333-82EF-4040F56CDD79'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'985BF8B4-00D1-463E-9AFE-376033D476F8'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Блинов'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Денис'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Владимирович'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Тех.&amp;nbsp;отдел'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Начальник&amp;nbsp;отдела'&lt;/span&gt;,3000&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Union Select&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'79050AEC-6E1A-4B7C-AB57-504616D646D4'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'B0E8AF1F-A604-4333-82EF-4040F56CDD79'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Колосов'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Александр'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Петрович'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'АУП'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Генеральный&amp;nbsp;директор'&lt;/span&gt;,3000&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Union Select&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'5854C6C1-E4D5-4393-878D-56ED6D6F5009'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'985BF8B4-00D1-463E-9AFE-376033D476F8'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Зайцева'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Валерия'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Сергеевна'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Программный&amp;nbsp;отдел'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Начальник&amp;nbsp;отдела'&lt;/span&gt;,4000&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Union Select&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'B0A73BBD-76B8-4001-82ED-61D415660F98'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'5854C6C1-E4D5-4393-878D-56ED6D6F5009'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Румянцев'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Алексей'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Леонидович'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Программный&amp;nbsp;отдел'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Программист'&lt;/span&gt;,4001&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Union Select&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'58A31717-AD9D-48B9-9BBD-6354DA528F08'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'5854C6C1-E4D5-4393-878D-56ED6D6F5009'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Наумов'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Максим'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Валерьевич'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Программный&amp;nbsp;отдел'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Программист'&lt;/span&gt;,4002&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Union Select&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'54361244-42E2-4D92-A6FA-A8E71699B31E'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'985BF8B4-00D1-463E-9AFE-376033D476F8'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Заглядимов'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Игорь'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Владимирович'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Отдел&amp;nbsp;продаж'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Начальник&amp;nbsp;отдела'&lt;/span&gt;,5000&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Union Select&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'68BE040F-2155-42ED-9162-AEFC257262F9'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'985BF8B4-00D1-463E-9AFE-376033D476F8'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Невзорова'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Елена'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Михайловна'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'АУП'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Секретарь'&lt;/span&gt;,1001&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Union Select&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'1519E421-213B-459E-8C2C-BBC1E814D864'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'54361244-42E2-4D92-A6FA-A8E71699B31E'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Антипов'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Николай'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Иванович'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Отдел&amp;nbsp;продаж'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Менеджер'&lt;/span&gt;,5001&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Union Select&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'B52D13F2-D6C7-41F1-A664-C6CB1D6CBE52'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'54361244-42E2-4D92-A6FA-A8E71699B31E'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Николаева'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Ирина'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Сергеевна'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Отдел&amp;nbsp;продаж'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Администратор'&lt;/span&gt;,5002&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Union Select&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'C105D4DD-A8D1-4F0E-BF0E-E6A19B21BD70'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'54361244-42E2-4D92-A6FA-A8E71699B31E'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Сидоров'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Петр'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Николаевич'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Отдел&amp;nbsp;продаж'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Продавец'&lt;/span&gt;,5003&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Union Select&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'7E3580C9-6466-4A45-858A-FA9B98E55705'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'54361244-42E2-4D92-A6FA-A8E71699B31E'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Коновалова'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Мария'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Алексеевна'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Отдел&amp;nbsp;продаж'&lt;/span&gt;,&lt;span style="color: #a31515;"&gt;'Продавец'&lt;/span&gt;,5004&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;GO&lt;/span&gt; &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Все ФИО и номера телефонов, разумеется вымышленные, совпадение с реальными людьми случайно ;)&lt;br /&gt;База данных для сервера готова. А с клиентской БД нам самим делать ничего и не придется, поскольку большую часть работы по созданию необходимых таблиц sync framework берет на себя.&lt;br /&gt;В следующей заметке опишу реализацию клиентского модуля синхронизации.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-1164558362990783496?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/1164558362990783496/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/01/microsoft-sync-framework_15.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/1164558362990783496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/1164558362990783496'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/01/microsoft-sync-framework_15.html' title='Изучаю Microsoft Sync Framework. База данных.'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_acCthH_ISgQ/S1BhVeKYi-I/AAAAAAAAABY/AjFxqZ-ffJQ/s72-c/PhoneRef_DBScheme.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-9097114218441045214</id><published>2010-01-10T23:36:00.007+03:00</published><updated>2010-01-14T12:17:44.364+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sync Framework'/><title type='text'>Изучаю Microsoft Sync Framework</title><content type='html'>Эх, ну вот, праздники позади, пора приниматься за блог =)&lt;br /&gt;Сейчас занимаюсь изучением&amp;nbsp;&lt;a href="http://msdn.microsoft.com/ru-ru/library/bb902854%28SQL.105%29.aspx"&gt;Microsoft Sync Framework&lt;/a&gt;, для этого придумал себе задачку - написать небольшое приложение. Это будет справочник внутренних телефонов. Что-то подобное я писал на своей предыдущей работе, но тот справочник мог работать только при наличии подключения к серверу БД. В новой версии я попытаюсь реализовать полноценный offline-режим.&lt;br /&gt;Итак, предполагается следующая архитектура :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Основное хранилище данных MSSQL Server 2005&lt;/li&gt;&lt;li&gt;Для хранения локальных данных будет использоваться база SQL Server Compact&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Приложение будет состоять из двух частей:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Справочник - приложение висит в трее, по клику открывается форма поиска и отображения информации о сотрудниках (ФИО, отдел, должность, руководитель, телефон).&lt;/li&gt;&lt;li&gt;Редактор - поскольку эта возможность нужна не всем пользователям, и что бы не усложнять приложение логикой разделения доступа, реализуем функционал редактирования в виде отдельного приложения, заодно посмотрим двунаправленную синхронизацию.&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Чтение и редактирование данных будет осуществляться непосредственно в локальной базе, и с помощью Sync Framework синхронизироваться с сервером.&lt;/li&gt;&lt;/ul&gt;В ближайших заметках, по мере решения задачи, постараюсь опубликовать результаты.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-9097114218441045214?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/9097114218441045214/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2010/01/microsoft-sync-framework.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/9097114218441045214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/9097114218441045214'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2010/01/microsoft-sync-framework.html' title='Изучаю Microsoft Sync Framework'/><author><name>alex.algel</name><uri>http://www.blogger.com/profile/17651298911992013918</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-554011446340472303</id><published>2009-12-16T15:37:00.002+03:00</published><updated>2010-03-13T22:08:34.700+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extension methods'/><title type='text'>Extension method для загрузки изображения из ресурсов</title><content type='html'>Сегодня написал простенький extension для загрузки изображений из ресурсов сборки:&lt;br /&gt;  &lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"&gt;&lt;small&gt;&lt;a href="http://s-c.me/5997/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/5997/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;ol&gt;&lt;li&gt;&lt;font color="#0000ff"&gt;public static&lt;/font&gt; &lt;font color="#2b91af"&gt;Bitmap&lt;/font&gt; LoadResourceBitmap(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#2b91af"&gt;Assembly&lt;/font&gt; assembly, &lt;font color="#0000ff"&gt;string&lt;/font&gt; imageResourcePath) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;var&lt;/font&gt; stream = assembly.GetManifestResourceStream(imageResourcePath);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; stream != &lt;font color="#0000ff"&gt;null&lt;/font&gt; ? &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Bitmap&lt;/font&gt;(stream) : &lt;font color="#0000ff"&gt;null&lt;/font&gt;;&lt;/li&gt; &lt;li&gt;} &lt;/li&gt; &lt;/ol&gt;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;  Теперь вместо такого кода:&lt;br /&gt;  &lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"&gt;&lt;small&gt;&lt;a href="http://s-c.me/6001/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/6001/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;ol&gt;&lt;li&gt;&lt;font color="#2b91af"&gt;Bitmap&lt;/font&gt; im = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Bitmap&lt;/font&gt;(&lt;font color="#2b91af"&gt;Assembly&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.GetExecutingAssembly()&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.GetManifestResourceStream(&lt;font color="#A31515"&gt;"LFGrid.NotSigned.bmp"&lt;/font&gt;)); &lt;/li&gt; &lt;/ol&gt;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;  который помимо некоторой громоздкости подсвечивается решарпером как warning, можно писать так:&lt;br /&gt;  &lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"&gt;&lt;small&gt;&lt;a href="http://s-c.me/6003/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/6003/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;ol&gt;&lt;li&gt;&lt;font color="#2b91af"&gt;Bitmap&lt;/font&gt; im = &lt;font color="#2b91af"&gt;Assembly&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.GetExecutingAssembly()&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.LoadResourceBitmap(&lt;font color="#A31515"&gt;"LFGrid.NotSigned.bmp"&lt;/font&gt;); &lt;/li&gt; &lt;/ol&gt;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;  Просто, понятно и ReSharper доволен ;-)  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-554011446340472303?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/554011446340472303/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2009/12/extension-method.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/554011446340472303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/554011446340472303'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2009/12/extension-method.html' title='Extension method для загрузки изображения из ресурсов'/><author><name>algel</name><uri>http://www.blogger.com/profile/01266074436759408164</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-8921089531758957596</id><published>2009-12-12T22:58:00.002+03:00</published><updated>2010-03-13T22:28:19.099+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unity'/><category scheme='http://www.blogger.com/atom/ns#' term='IOC'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><title type='text'>Использование Unity в ASP.NET MVC</title><content type='html'>&lt;a href="http://codeclimber.net.nz/"&gt;Simone Chiaretta&lt;/a&gt; опубликовал &lt;a href="http://codeclimber.net.nz/archive/2009/12/11/asp.net-mvc-controllerfactory-for-unity-and-the-reasoning-behind-it.aspx"&gt;статью&lt;/a&gt; об использовании &lt;a href="http://www.codeplex.com/unity/"&gt;Unity &lt;/a&gt;(&lt;a href="http://en.wikipedia.org/wiki/Inversion_of_control"&gt;IOC&lt;/a&gt; Framework) в ASP.NET MVC для создания контролеров.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Если коротко, то делается это за два шага:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Создаем класс наследник от класса &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx"&gt;DefaultControllerFactory&lt;/a&gt; либо реализующий интерфейс &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.mvc.icontrollerfactory.aspx"&gt;IControllerFactory&lt;/a&gt;.&lt;/li&gt;  &lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"&gt;&lt;small&gt;&lt;a href="http://s-c.me/6004/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/6004/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;ol&gt;&lt;li&gt;&lt;font color="#0000ff"&gt;public class&lt;/font&gt; &lt;font color="#2b91af"&gt;UnityControllerFactory&lt;/font&gt;: &lt;font color="#2b91af"&gt;DefaultControllerFactory&lt;/font&gt; {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;protected override&lt;/font&gt; &lt;font color="#2b91af"&gt;IController&lt;/font&gt; GetControllerInstance(&lt;font color="#2b91af"&gt;Type&lt;/font&gt; controllerType) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;IController&lt;/font&gt; controller;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;if&lt;/font&gt; (controllerType == &lt;font color="#0000ff"&gt;null&lt;/font&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;throw new&lt;/font&gt; &lt;font color="#2b91af"&gt;HttpException&lt;/font&gt;(&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#A31515"&gt;404&lt;/font&gt;, &lt;font color="#2b91af"&gt;String&lt;/font&gt;.Format(&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#A31515"&gt;"The&amp;nbsp;controller&amp;nbsp;for&amp;nbsp;path&amp;nbsp;'{0}'&amp;nbsp;could&amp;nbsp;not&amp;nbsp;be&amp;nbsp;found"&lt;/font&gt; +&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#A31515"&gt;"or&amp;nbsp;it&amp;nbsp;does&amp;nbsp;not&amp;nbsp;implement&amp;nbsp;IController."&lt;/font&gt;,&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;this&lt;/font&gt;.RequestContext.HttpContext.Request.Path));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;if&lt;/font&gt; (!&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;(&lt;font color="#2b91af"&gt;IController&lt;/font&gt;).IsAssignableFrom(controllerType))&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;throw new&lt;/font&gt; &lt;font color="#2b91af"&gt;ArgumentException&lt;/font&gt;(&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#A31515"&gt;"Type&amp;nbsp;requested&amp;nbsp;is&amp;nbsp;not&amp;nbsp;a&amp;nbsp;controller:&amp;nbsp;{0}"&lt;/font&gt;,&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;controllerType.Name),&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#A31515"&gt;"controllerType"&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;try&lt;/font&gt; {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;controller = &lt;font color="#2b91af"&gt;MvcUnityContainer&lt;/font&gt;.Container.Resolve(controllerType)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;as&lt;/font&gt; &lt;font color="#2b91af"&gt;IController&lt;/font&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;font color="#0000ff"&gt;catch&lt;/font&gt; (&lt;font color="#2b91af"&gt;Exception&lt;/font&gt; ex) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;throw new&lt;/font&gt; &lt;font color="#2b91af"&gt;InvalidOperationException&lt;/font&gt;(&lt;font color="#2b91af"&gt;String&lt;/font&gt;.Format(&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#A31515"&gt;"Error&amp;nbsp;resolving&amp;nbsp;controller&amp;nbsp;{0}"&lt;/font&gt;,&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;controllerType.Name),ex);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; controller;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;font color="#0000ff"&gt;public static class&lt;/font&gt; &lt;font color="#2b91af"&gt;MvcUnityContainer&lt;/font&gt; {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public static&lt;/font&gt; UnityContainer Container { &lt;font color="#0000ff"&gt;get&lt;/font&gt;; &lt;font color="#0000ff"&gt;set&lt;/font&gt;; }&lt;/li&gt; &lt;li&gt;} &lt;/li&gt; &lt;/ol&gt;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;  &lt;li&gt;Затем регистрируем наш класс в &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbuilder.aspx"&gt;ControllerBuilder&lt;/a&gt;, используя метод &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbuilder.setcontrollerfactory.aspx"&gt;SetControllerFactory&lt;/a&gt;.&lt;/li&gt;  &lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"&gt;&lt;small&gt;&lt;a href="http://s-c.me/6005/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/6005/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;ol&gt;&lt;li&gt;&lt;font color="#008000"&gt;//Create&amp;nbsp;UnityContainer&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&lt;font color="#2b91af"&gt;UnityContainer&lt;/font&gt; container = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;UnityContainer&lt;/font&gt;();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;font color="#008000"&gt;//Configure&amp;nbsp;container&lt;/font&gt;&lt;/li&gt; &lt;li&gt;container.RegisterType&amp;lt;&lt;font color="#2b91af"&gt;IFrontendService&lt;/font&gt;, &lt;font color="#2b91af"&gt;FrontendService&lt;/font&gt;&amp;gt;();&lt;/li&gt; &lt;li&gt;container.RegisterType&amp;lt;&lt;font color="#2b91af"&gt;IDateTimeProvider&lt;/font&gt;, &lt;font color="#2b91af"&gt;DateTimeProvider&lt;/font&gt;&amp;gt;();&lt;/li&gt; &lt;li&gt;container.RegisterType&amp;lt;&lt;font color="#2b91af"&gt;IFrontendDataAccess&lt;/font&gt;, &lt;font color="#2b91af"&gt;SqlFrontendDataAccess&lt;/font&gt;&amp;gt;();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;font color="#008000"&gt;//Set&amp;nbsp;container&amp;nbsp;for&amp;nbsp;Controller&amp;nbsp;Factory&lt;/font&gt;&lt;/li&gt; &lt;li&gt;MvcUnityContainer.Container = container;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;font color="#008000"&gt;//Set&amp;nbsp;for&amp;nbsp;Controller&amp;nbsp;Factory&lt;/font&gt;&lt;/li&gt; &lt;li&gt;ControllerBuilder.Current.SetControllerFactory(&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;(&lt;font color="#2b91af"&gt;UnityControllerFactory&lt;/font&gt;)); &lt;/li&gt; &lt;/ol&gt;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;  &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-8921089531758957596?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/8921089531758957596/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2009/12/unity-aspnet-mvc.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/8921089531758957596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/8921089531758957596'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2009/12/unity-aspnet-mvc.html' title='Использование Unity в ASP.NET MVC'/><author><name>algel</name><uri>http://www.blogger.com/profile/01266074436759408164</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-7918421387606683658</id><published>2009-11-28T01:23:00.137+03:00</published><updated>2010-03-13T21:55:50.607+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DataSet'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ to DataSet'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>Производительность LINQ to DataSet.</title><content type='html'>Уф, наконец-то это случилось, на работе решились перевести проект с .Net 2.0&amp;nbsp; на .Net 3.5!&lt;br /&gt;Разумеется руки так и чешутся задействовать новые фишки =). Решил поплотнее заняться LINQ, хотя остальные к моей затее отнеслись скептически...&lt;br /&gt;Так вот, в проектах для передачи данных между сервером и клиентом мы используем датасеты. И нередко встречаются различные выборки данных из таблиц.&lt;br /&gt;&lt;br /&gt;И мне стало интересно, имеет ли смысл заменять подобные места в коде выражениями LINQ? И в первую очередь с точки зрения производительности.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Для проверки создадим табличку с тремя полями (Id, ParentId, Value), в которую было залито 1000 родительских записей (ParentId = DBNul.Value), плюс для каждой из них по 100 дочерних записей.&lt;br /&gt;Далее реализуем тесты для выборки данных по разным колонкам, т.е. проверим скорость выборки по ключевому, не ключевому и текстовому полю.&lt;br /&gt;Для замеров производительности "родных" методов исходный код методов выглядит так:&lt;br /&gt;  &lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"&gt;&lt;small&gt;&lt;a href="http://s-c.me/5993/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/5993/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;ol&gt;&lt;li&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt; System;&lt;/li&gt; &lt;li&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt; System.Collections.Generic;&lt;/li&gt; &lt;li&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt; System.Data;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;font color="#0000ff"&gt;namespace&lt;/font&gt; LinqPerformanceTest.Tests.LinqToDataset {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public static class&lt;/font&gt; &lt;font color="#2b91af"&gt;DataSetsTests&lt;/font&gt; {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private const int&lt;/font&gt; Iterations = &lt;font color="#A31515"&gt;1000&lt;/font&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private static readonly&lt;/font&gt; &lt;font color="#2b91af"&gt;Random&lt;/font&gt; Rnd = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Random&lt;/font&gt;(&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now.Millisecond);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private static&lt;/font&gt; &lt;font color="#2b91af"&gt;DataTable&lt;/font&gt; GetTreeTable() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataSetStorage.InitTreeTable(&lt;font color="#0000ff"&gt;false&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; DataSetStorage.TreeTable;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public static void&lt;/font&gt; DS_RandomSelectByKey(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#2b91af"&gt;Test&lt;/font&gt; t) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;DataTable&lt;/font&gt; dt = GetTreeTable();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;string&lt;/font&gt; query = &lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(&lt;font color="#A31515"&gt;"{0}="&lt;/font&gt;, dt.Columns[&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;].ColumnName);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;var&lt;/font&gt; results = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;List&lt;/font&gt;&amp;lt;&lt;font color="#2b91af"&gt;DataRow&lt;/font&gt;[]&amp;gt;(Iterations);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Started(&lt;font color="#A31515"&gt;"Выборка&amp;nbsp;данных&amp;nbsp;по&amp;nbsp;первичному&amp;nbsp;ключу&amp;nbsp;методом&amp;nbsp;DataTable.Select"&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;; i &amp;lt; Iterations; i++) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;results.Add(dt.Select(query + Rnd.Next(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, Iterations - &lt;font color="#A31515"&gt;1&lt;/font&gt;)));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Completed(&lt;font color="#A31515"&gt;"Выполнено&amp;nbsp;{0}&amp;nbsp;селектов."&lt;/font&gt;, Iterations);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public static void&lt;/font&gt; DS_RandomSelectByNumericField(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#2b91af"&gt;Test&lt;/font&gt; t) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;DataTable&lt;/font&gt; dt = GetTreeTable();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;string&lt;/font&gt; query = &lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(&lt;font color="#A31515"&gt;"{0}="&lt;/font&gt;, dt.Columns[&lt;font color="#A31515"&gt;1&lt;/font&gt;].ColumnName);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Started(&lt;font color="#A31515"&gt;"Выборка&amp;nbsp;данных&amp;nbsp;по&amp;nbsp;числовому&amp;nbsp;полю&amp;nbsp;методом&amp;nbsp;DataTable.Select"&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;; i &amp;lt; Iterations; i++) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dt.Select(query + Rnd.Next(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, Iterations - &lt;font color="#A31515"&gt;1&lt;/font&gt;));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Completed(&lt;font color="#A31515"&gt;"Выполнено&amp;nbsp;{0}&amp;nbsp;селектов."&lt;/font&gt;, Iterations);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public static void&lt;/font&gt; DS_RandomSelectByStringField(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#2b91af"&gt;Test&lt;/font&gt; t) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;DataTable&lt;/font&gt; dt = GetTreeTable();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;string&lt;/font&gt; query = &lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(&lt;font color="#A31515"&gt;"{0}&amp;nbsp;LIKE&amp;nbsp;'*"&lt;/font&gt;, dt.Columns[&lt;font color="#A31515"&gt;2&lt;/font&gt;].ColumnName);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Started(&lt;font color="#A31515"&gt;"Выборка&amp;nbsp;данных&amp;nbsp;по&amp;nbsp;текстовому&amp;nbsp;полю&amp;nbsp;с&amp;nbsp;помощью&amp;nbsp;DataTable.Select"&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;; i &amp;lt; Iterations; i++) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dt.Select(query + Rnd.Next(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, Iterations - &lt;font color="#A31515"&gt;1&lt;/font&gt;) + &lt;font color="#A31515"&gt;"'"&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Completed(&lt;font color="#A31515"&gt;"Выполнено&amp;nbsp;{0}&amp;nbsp;селектов."&lt;/font&gt;, Iterations);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;/ol&gt;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;  Для замеров производительности LINQ проверим сценарии когда нам нужны все найденные записи, и только первой.&lt;br /&gt;  &lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"&gt;&lt;small&gt;&lt;a href="http://s-c.me/5994/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/5994/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;ol&gt;&lt;li&gt;&lt;font color="#0000ff"&gt;public static class&lt;/font&gt; &lt;font color="#2b91af"&gt;LinqTests&lt;/font&gt; {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private const int&lt;/font&gt; Iterations = &lt;font color="#A31515"&gt;1000&lt;/font&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private static readonly&lt;/font&gt; &lt;font color="#2b91af"&gt;Random&lt;/font&gt; Rnd = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Random&lt;/font&gt;(&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now.Millisecond);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private static&lt;/font&gt; &lt;font color="#2b91af"&gt;DataTable&lt;/font&gt; GetTreeTable() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataSetStorage.InitTreeTable(&lt;font color="#0000ff"&gt;false&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; DataSetStorage.TreeTable;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public static void&lt;/font&gt; LinqToDS_RandomSelectByKey(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#2b91af"&gt;Test&lt;/font&gt; t) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;DataTable&lt;/font&gt; dt = GetTreeTable();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Started(&lt;font color="#A31515"&gt;"Выбираем&amp;nbsp;все&amp;nbsp;записи&amp;nbsp;по&amp;nbsp;первичному&amp;nbsp;ключу&amp;nbsp;запросом&amp;nbsp;LINQ"&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;; i &amp;lt; Iterations; i++) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;font color="#0000ff"&gt;from&lt;/font&gt; row &lt;font color="#0000ff"&gt;in&lt;/font&gt; dt.AsEnumerable()&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;where&lt;/font&gt; row.Field&amp;lt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&amp;gt;(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;) == Rnd.Next(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, Iterations - &lt;font color="#A31515"&gt;1&lt;/font&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;select&lt;/font&gt; row).ToArray();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Completed(&lt;font color="#A31515"&gt;"Выполнено&amp;nbsp;{0}&amp;nbsp;селектов."&lt;/font&gt;, Iterations);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public static void&lt;/font&gt; LinqToDS_RandomSelectOneRowByKey(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#2b91af"&gt;Test&lt;/font&gt; t) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;DataTable&lt;/font&gt; dt = GetTreeTable();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Started(&lt;font color="#A31515"&gt;"Выбираем&amp;nbsp;первую&amp;nbsp;запись&amp;nbsp;по&amp;nbsp;первичному&amp;nbsp;ключу&amp;nbsp;запросом&amp;nbsp;LINQ"&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;; i &amp;lt; Iterations; i++) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;font color="#0000ff"&gt;from&lt;/font&gt; row &lt;font color="#0000ff"&gt;in&lt;/font&gt; dt.AsEnumerable()&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;where&lt;/font&gt; row.Field&amp;lt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&amp;gt;(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;) == Rnd.Next(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, Iterations - &lt;font color="#A31515"&gt;1&lt;/font&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;select&lt;/font&gt; row).FirstOrDefault();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Completed(&lt;font color="#A31515"&gt;"Выполнено&amp;nbsp;{0}&amp;nbsp;селектов."&lt;/font&gt;, Iterations);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public static void&lt;/font&gt; LinqToDS_RandomSelectByNumericField(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#2b91af"&gt;Test&lt;/font&gt; t) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;DataTable&lt;/font&gt; dt = GetTreeTable();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Started(&lt;font color="#A31515"&gt;"Выбираем&amp;nbsp;все&amp;nbsp;записи&amp;nbsp;по&amp;nbsp;числовому&amp;nbsp;полю&amp;nbsp;запросом&amp;nbsp;LINQ"&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;; i &amp;lt; Iterations; i++) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;font color="#0000ff"&gt;from&lt;/font&gt; row &lt;font color="#0000ff"&gt;in&lt;/font&gt; dt.AsEnumerable()&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;where&lt;/font&gt; row.Field&amp;lt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;?&amp;gt;(&lt;font color="#A31515"&gt;1&lt;/font&gt;) == Rnd.Next(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, Iterations - &lt;font color="#A31515"&gt;1&lt;/font&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;select&lt;/font&gt; row).ToArray();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Completed(&lt;font color="#A31515"&gt;"Выполнено&amp;nbsp;{0}&amp;nbsp;селектов."&lt;/font&gt;, Iterations);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public static void&lt;/font&gt; LinqToDS_RandomSelectOneRowByNumericField(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#2b91af"&gt;Test&lt;/font&gt; t) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;DataTable&lt;/font&gt; dt = GetTreeTable();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Started(&lt;font color="#A31515"&gt;"Выбираем&amp;nbsp;первую&amp;nbsp;запись&amp;nbsp;по&amp;nbsp;числовому&amp;nbsp;полю&amp;nbsp;запросом&amp;nbsp;LINQ"&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;; i &amp;lt; Iterations; i++) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;font color="#0000ff"&gt;from&lt;/font&gt; row &lt;font color="#0000ff"&gt;in&lt;/font&gt; dt.AsEnumerable()&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;where&lt;/font&gt; row.Field&amp;lt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;?&amp;gt;(&lt;font color="#A31515"&gt;1&lt;/font&gt;) == Rnd.Next(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, Iterations - &lt;font color="#A31515"&gt;1&lt;/font&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;select&lt;/font&gt; row).FirstOrDefault();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Completed(&lt;font color="#A31515"&gt;"Выполнено&amp;nbsp;{0}&amp;nbsp;селектов."&lt;/font&gt;, Iterations);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public static void&lt;/font&gt; LinqToDS_RandomSelectByStringField(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#2b91af"&gt;Test&lt;/font&gt; t) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;DataTable&lt;/font&gt; dt = GetTreeTable();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Started(&lt;font color="#A31515"&gt;"Выбираем&amp;nbsp;все&amp;nbsp;записи&amp;nbsp;по&amp;nbsp;текстовому&amp;nbsp;полю&amp;nbsp;запросом&amp;nbsp;LINQ"&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;; i &amp;lt; Iterations; i++) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;font color="#0000ff"&gt;from&lt;/font&gt; row &lt;font color="#0000ff"&gt;in&lt;/font&gt; dt.AsEnumerable()&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;where&lt;/font&gt; row.Field&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&amp;gt;(&lt;font color="#A31515"&gt;2&lt;/font&gt;).EndsWith(Rnd.Next(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, Iterations - &lt;font color="#A31515"&gt;1&lt;/font&gt;).ToString())&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;select&lt;/font&gt; row).ToArray();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Completed(&lt;font color="#A31515"&gt;"Выполнено&amp;nbsp;{0}&amp;nbsp;селектов."&lt;/font&gt;, Iterations);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public static void&lt;/font&gt; LinqToDS_RandomSelectOneRowByStringField(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#2b91af"&gt;Test&lt;/font&gt; t) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;DataTable&lt;/font&gt; dt = GetTreeTable();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Started(&lt;font color="#A31515"&gt;"Выбираем&amp;nbsp;первую&amp;nbsp;запись&amp;nbsp;по&amp;nbsp;текстовому&amp;nbsp;полю&amp;nbsp;запросом&amp;nbsp;LINQ"&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;; i &amp;lt; Iterations; i++) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;font color="#0000ff"&gt;from&lt;/font&gt; row &lt;font color="#0000ff"&gt;in&lt;/font&gt; dt.AsEnumerable()&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;where&lt;/font&gt; row.Field&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&amp;gt;(&lt;font color="#A31515"&gt;2&lt;/font&gt;).EndsWith(Rnd.Next(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, Iterations - &lt;font color="#A31515"&gt;1&lt;/font&gt;).ToString())&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;select&lt;/font&gt; row).FirstOrDefault();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Completed(&lt;font color="#A31515"&gt;"Выполнено&amp;nbsp;{0}&amp;nbsp;селектов."&lt;/font&gt;, Iterations);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;/ol&gt;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;  Как видно все методы реализованы в виде Extension methods к вспомогательному классу Test, который берет на себя функции замера времени и вывода сообщений на консоль.&lt;br /&gt;  &lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"&gt;&lt;small&gt;&lt;a href="http://s-c.me/5996/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/5996/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;ol&gt;&lt;li&gt;&lt;font color="#0000ff"&gt;public class&lt;/font&gt; &lt;font color="#2b91af"&gt;Test&lt;/font&gt; {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private readonly&lt;/font&gt; &lt;font color="#2b91af"&gt;Stopwatch&lt;/font&gt; _st = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Stopwatch&lt;/font&gt;();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private readonly&lt;/font&gt; &lt;font color="#2b91af"&gt;ConsoleColor&lt;/font&gt; _foreColor;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#2b91af"&gt;Test&lt;/font&gt;(&lt;font color="#2b91af"&gt;ConsoleColor&lt;/font&gt; foreColor) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_foreColor = foreColor;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public void&lt;/font&gt; Started(&lt;font color="#0000ff"&gt;string&lt;/font&gt; msgTemplate, &lt;font color="#0000ff"&gt;params object&lt;/font&gt;[] args) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.ForegroundColor = _foreColor;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine(&lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(msgTemplate, args));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_st.Reset();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_st.Start();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public void&lt;/font&gt; Completed(&lt;font color="#0000ff"&gt;string&lt;/font&gt; msgTemplate, &lt;font color="#0000ff"&gt;params object&lt;/font&gt;[] args) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_st.Stop();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.ForegroundColor = _foreColor;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine(&lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(&lt;font color="#A31515"&gt;"{0}&amp;nbsp;Затраченное&amp;nbsp;время:&amp;nbsp;{1}&amp;nbsp;ms."&lt;/font&gt;, &lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(msgTemplate, args), _st.ElapsedMilliseconds));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;/ol&gt;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;  Код создающий таблицу и наполняющий ее записями достаточно прост, поэтому тут приводить его не буду. Итак все готово, запускаем!&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_pkXux0Jk51I/SxkWP2SwjxI/AAAAAAAAB6c/6m2eThCG2pg/s1600-h/LinqToDataSet1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_pkXux0Jk51I/SxkWP2SwjxI/AAAAAAAAB6c/6m2eThCG2pg/s320/LinqToDataSet1.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;К сожалению, LINQ в данном тесте показал себя не лучшим образом. Похоже что расширение LinqToDataSet работает с таблицами как с обычной коллекцией объектов DataRow. А значит не стоит переписывать все имеющиеся обращения к методам DataTable.Select запросами LINQ.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-7918421387606683658?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/7918421387606683658/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2009/11/datatable.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/7918421387606683658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/7918421387606683658'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2009/11/datatable.html' title='Производительность LINQ to DataSet.'/><author><name>algel</name><uri>http://www.blogger.com/profile/01266074436759408164</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pkXux0Jk51I/SxkWP2SwjxI/AAAAAAAAB6c/6m2eThCG2pg/s72-c/LinqToDataSet1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-876821467447331505</id><published>2009-11-27T15:59:00.001+03:00</published><updated>2009-12-10T16:44:08.985+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Мысли вслух'/><title type='text'>Михаил Веллер - Ноль часов. Впечатления</title><content type='html'>Довелось как-то ознакомиться с данным произведением.&lt;br /&gt;&lt;br /&gt;Вкратце сюжет следующий, служили моряки на крейсере Аврора, ну и в девяностые годы настолько их достала суровая действительность, что они решили угнать собственный крейсер, и добраться на нем до Москвы, что бы там показать где раки зимуют...&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Так вот учитывая то что я пять лет отработал на флоте, и достаточно хорошо разбираюсь в специфике того, что пытается описать автор - впечатления только негативные.&lt;br /&gt;Итак:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;i&gt;Что бы было чем кормить двигатель на протяжении такого перехода, некто (не помню уже кто) из команды Авроры поехал на рейд нефтеналивных судов, и там договорился с капитаном &lt;b&gt;Волго-Балта(!)&lt;/b&gt; о 10-ти тоннах мазута...&lt;/i&gt;&amp;nbsp; Волго-Доны, и Волго-Балты - это сухогрузные суда, т.е. они при всем желании не могут перевозить нефтеналивные грузы, в частности мазут. (автор явно путает их с теплоходами типа Волгонефть, и Нефтерудовоз).&lt;/li&gt;&lt;li&gt;&lt;i&gt;Во время разводки, этот самый Волго-балт (который, как мы уже поняли, на самом деле был кем-то другим ;-)) отбился от каравана, и пришвартовавшись к Авроре слил те самые 10 т. мазута, и как ни в чем не бывало пошел дальше...&lt;/i&gt;&amp;nbsp; Вот только в разводку суда идут с лоцманом, в порядке очереди под контролем диспетчера (т.е. этот эпизод - полнейший бред, для капитана это был бы последний рейс, не говоря уже о том, что мазут, перед перекачкой, еще надо нагреть, иначе он не качается... вязкий слишком)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://file.interfotki.ru/photo/14/60/146026/twws7s_cont.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://file.interfotki.ru/photo/14/60/146026/twws7s_cont.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.riverships.ru/photos/volgobalt_214.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://www.riverships.ru/photos/volgobalt_214.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Когда они вышли в Ладожское озеро, была сказана фраза "Не смотри в компас, не в море." и далее рекомендация ориентироваться по берегу..&lt;/i&gt; Это по меньшей мере глупо, поскольку в Ладожском озере ходят только по компасу, а то не долго заблудиться и на мель вылететь... &lt;/li&gt;&lt;li&gt;Даже если бы команде и удалось угнать крейсер, то дальше первого шлюза их бы не пустили, не смотря на их вооружение... взорвать же его (шлюз) себе дороже (кстати в октябре очередей перед шлюзами, по крайней мере на Свири, уже не бывает), до Москвы им необходимо преодолеть 18 шлюзов...&lt;/li&gt;&lt;li&gt;&lt;i&gt;Когда они вышли в Белое озеро, то командир дал указание строго держаться фарватера, мол иначе на мель вылетим...&lt;/i&gt;&amp;nbsp; На Белом озере, фарватера как такового нет, если посмотреть на карту, то оно имеет форму блюдца, с глубиной 5,4 м. практически по всей площади озера... И еще один маленький нюанс, крейсер Аврора имеет осадку 6,4 м., следовательно Белое озеро для него тоже было непреодолимой преградой...&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Это только самые крупные ляпы в первой половине книги, дальше читать этот бред уже просто не хватило терпения...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-876821467447331505?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/876821467447331505/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2009/11/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/876821467447331505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/876821467447331505'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2009/11/blog-post.html' title='Михаил Веллер - Ноль часов. Впечатления'/><author><name>algel</name><uri>http://www.blogger.com/profile/01266074436759408164</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-2949388779684266714</id><published>2009-11-27T15:31:00.001+03:00</published><updated>2009-12-10T16:43:30.997+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Мысли вслух'/><title type='text'>Linux vs Линекс</title><content type='html'>Периодически слышу от знакомых девушек, фразы типа:&lt;br /&gt;&lt;i&gt;- А чем линекс отличается от виндоус?&lt;/i&gt;&lt;br /&gt;&lt;i&gt;- А можно снести линекс и поставить винду?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Девушки!!!&lt;br /&gt;&lt;b&gt;Линекс&lt;/b&gt; это препарат для лечения дисбактериоза кишечника.&lt;br /&gt;А операционная система, про которую вы говорите, называется &lt;b&gt;ЛИНУКС (Linux)!&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-2949388779684266714?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/2949388779684266714/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2009/11/linux-vs.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/2949388779684266714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/2949388779684266714'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2009/11/linux-vs.html' title='Linux vs Линекс'/><author><name>algel</name><uri>http://www.blogger.com/profile/01266074436759408164</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3292493590960629250.post-6305993321700997342</id><published>2009-11-23T23:46:00.001+03:00</published><updated>2010-03-13T15:48:10.122+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DataBase'/><category scheme='http://www.blogger.com/atom/ns#' term='ADO.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Хранение изображений на web-сервере БД или ФС?</title><content type='html'>Недавно возник спор на тему где же на сервере лучше хранить изображения, а точнее какой вариант будет быстрее обрабатываться сервером?  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;Вот два варианта:  &lt;br /&gt;1. Картинка лежит в базе данных - (тут может быть несколько вариантов того как мы будем перехватывать запрос, я взял самый простой вариант)  &lt;br /&gt;ссылка вида &lt;b&gt;&lt;i&gt;http://mydomain.com/getimage.aspx?id=100001&lt;/i&gt;&lt;/b&gt;  &lt;br /&gt;в этом случае сервер перенаправляет запрос в некий код написанный мной в котором инициализируется соединение с сервером БД, формируется и выполняется запрос, считывается результат и отдается в выходной поток.  &lt;br /&gt;  &lt;br /&gt;2. Картинка лежит в файловой системе сервера  &lt;br /&gt;ссылка вида &lt;b&gt;&lt;i&gt;http://mydomain.com/images/100001.jpg&lt;/i&gt;&lt;/b&gt;  &lt;br /&gt;и в этом случае веб сервер просто считывает этот файл с диска и отдает в выходной поток...  &lt;br /&gt;  &lt;br /&gt;&lt;a name="more"&gt;&lt;/a&gt;  &lt;br /&gt;В начале спора мне казалось очевидным, что второй вариант будет работать быстрее, однако тесты показали что тут все не так просто...  &lt;br /&gt;  &lt;br /&gt;Итак, для тестирования использовалась следующая конфигурация:  &lt;br /&gt;Ноутбук Toshiba Satellite A200  &lt;br /&gt;ОС: Windows 7 Ultimate  &lt;br /&gt;ОЗУ: 1 Гб  &lt;br /&gt;HDD: Fujitsu MHW2120BH ATA 120 Гб поделен на 2 раздела по 60 Гб  &lt;br /&gt;CPU: Genuine Intel(R) T2130 1.86 GHz 2 ядра  &lt;br /&gt;Веб сервер: IIS 7.5  &lt;br /&gt;Серверная часть написана на ASP.NET  &lt;br /&gt;Клиент написан на .Net Framework 3.5 SP1  &lt;br /&gt;База данных расположена на локальном MS SQL Server 2005  &lt;br /&gt;  &lt;br /&gt;В качестве тестового образца картинки был выбран файл jpg размером 141 Кб  &lt;br /&gt;Далее была создана база с одной единственной таблицей Images. Таблица содержит в себе 2 поля:  &lt;br /&gt;- [Name] nvarchar(50) primary key  &lt;br /&gt;- [Content] image not null  &lt;br /&gt;После в таблицу было вставлено 100 000 записей с названием файла вида '00000.jpg' до '99999.jpg' и содержимым в виде массива байтов.  &lt;br /&gt;  &lt;br /&gt;Так же в папку на диске было скопировано 100 000 копий этого файла.  &lt;br /&gt;  &lt;br /&gt;Для обработки запросов на сервере было решено использовать HttpHandler:  &lt;br /&gt;  &lt;br /&gt;  &lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"&gt;&lt;small&gt;&lt;a href="http://s-c.me/5989/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/5989/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;ol&gt;&lt;li&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt; System.Data;&lt;/li&gt; &lt;li&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt; System.Web;&lt;/li&gt; &lt;li&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt; System.Data.SqlClient;&lt;/li&gt; &lt;li&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt; System.IO;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;font color="#008000"&gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&lt;font color="#008000"&gt;///&amp;nbsp;Summary&amp;nbsp;description&amp;nbsp;for&amp;nbsp;GetFileHandler&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&lt;font color="#008000"&gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&lt;font color="#0000ff"&gt;public class&lt;/font&gt; &lt;font color="#2b91af"&gt;GetFileHandler&lt;/font&gt; : &lt;font color="#2b91af"&gt;IHttpHandler&lt;/font&gt;&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private const string&lt;/font&gt; ConnString = &lt;font color="#A31515"&gt;"Data&amp;nbsp;source=(local);&amp;nbsp;Initial&amp;nbsp;Catalog=WP;&amp;nbsp;User&amp;nbsp;Id&amp;nbsp;=&amp;nbsp;web;&amp;nbsp;Password=web"&lt;/font&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private const string&lt;/font&gt; CmdText = &lt;font color="#A31515"&gt;"Select&amp;nbsp;Content&amp;nbsp;From&amp;nbsp;Images&amp;nbsp;Where&amp;nbsp;Name&amp;nbsp;=&amp;nbsp;@Name"&lt;/font&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#cc6633"&gt;#region&lt;/font&gt; &lt;font color="#2b91af"&gt;IHttpHandler&lt;/font&gt; Members&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public bool&lt;/font&gt; IsReusable&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;get&lt;/font&gt; { &lt;font color="#0000ff"&gt;return true&lt;/font&gt;; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;public void&lt;/font&gt; ProcessRequest(&lt;font color="#2b91af"&gt;HttpContext&lt;/font&gt; context)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;string&lt;/font&gt; fileName = context.Request[&lt;font color="#A31515"&gt;"id"&lt;/font&gt;];&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;if&lt;/font&gt; (&lt;font color="#0000ff"&gt;string&lt;/font&gt;.IsNullOrEmpty(fileName))&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.StatusCode = &lt;font color="#A31515"&gt;404&lt;/font&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.End();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;const int&lt;/font&gt; bufferSize = &lt;font color="#A31515"&gt;1024&lt;/font&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;using&lt;/font&gt; (&lt;font color="#0000ff"&gt;var&lt;/font&gt; conn = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;SqlConnection&lt;/font&gt;(ConnString))&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;using&lt;/font&gt; (&lt;font color="#0000ff"&gt;var&lt;/font&gt; cmd = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;SqlCommand&lt;/font&gt;(CmdText, conn))&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd.Parameters.AddWithValue(&lt;font color="#A31515"&gt;"Name"&lt;/font&gt;, &lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(&lt;font color="#A31515"&gt;"{0}.jpg"&lt;/font&gt;,fileName));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.Open();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;using&lt;/font&gt; (&lt;font color="#2b91af"&gt;SqlDataReader&lt;/font&gt; dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;if&lt;/font&gt;(dr.Read())&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;var&lt;/font&gt; buffer = &lt;font color="#0000ff"&gt;new byte&lt;/font&gt;[bufferSize];&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.BufferOutput = &lt;font color="#0000ff"&gt;false&lt;/font&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.ContentType = &lt;font color="#A31515"&gt;"image/jpeg"&lt;/font&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.Clear();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;var&lt;/font&gt; writer = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;BinaryWriter&lt;/font&gt;(context.Response.OutputStream);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;int&lt;/font&gt; startIndex = &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;long&lt;/font&gt; retval = dr.GetBytes(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, startIndex, buffer, &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, bufferSize);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;while&lt;/font&gt;(retval==bufferSize)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.Write(buffer);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.Flush();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.Flush();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;startIndex += bufferSize;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval = dr.GetBytes(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, startIndex, buffer, &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, bufferSize);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.Write(buffer, &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, (&lt;font color="#0000ff"&gt;int&lt;/font&gt;)retval - &lt;font color="#A31515"&gt;1&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.Flush();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.Close();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.Flush();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.End();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#cc6633"&gt;#endregion&lt;/font&gt;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;/ol&gt;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt;  &lt;br /&gt;Клиентская часть представляет собой консольное приложение, которое сначала по десять раз запрашивает файл с сервера обоими способами, так сказать для разогрева, а потом выполняет цикл из 1000 проходов каждым способом с замером времени получения этого файла. Все результаты замеров складываются в массив, для расчета среднего значения.  &lt;br /&gt;Полный код выглядит так:  &lt;br /&gt;  &lt;blockquote&gt;&lt;code&gt;&lt;font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"&gt;&lt;small&gt;&lt;a href="http://s-c.me/5988/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/5988/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;ol&gt;&lt;li&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt; System;&lt;/li&gt; &lt;li&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt; System.Diagnostics;&lt;/li&gt; &lt;li&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt; System.Linq;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;font color="#0000ff"&gt;namespace&lt;/font&gt; &lt;font color="#2b91af"&gt;WebClient&lt;/font&gt; {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;static class&lt;/font&gt; &lt;font color="#2b91af"&gt;Program&lt;/font&gt; {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;static readonly&lt;/font&gt; &lt;font color="#2b91af"&gt;Stopwatch Stopwatch&lt;/font&gt; = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Stopwatch&lt;/font&gt;();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;static readonly&lt;/font&gt; &lt;font color="#2b91af"&gt;Random&lt;/font&gt; Rand = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Random&lt;/font&gt;(&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now.Millisecond);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;static string&lt;/font&gt;[] _urls;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private static long&lt;/font&gt;[][] _measures;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;///&amp;nbsp;The&amp;nbsp;main&amp;nbsp;entry&amp;nbsp;point&amp;nbsp;for&amp;nbsp;the&amp;nbsp;application.&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;font color="#2b91af"&gt;STAThread&lt;/font&gt;]&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;static void&lt;/font&gt; Main() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_urls = &lt;font color="#0000ff"&gt;new string&lt;/font&gt;[&lt;font color="#A31515"&gt;2&lt;/font&gt;];&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_urls[&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;] = &lt;font color="#A31515"&gt;"http://localhost/wp/getimage.aspx?id={0}"&lt;/font&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_urls[&lt;font color="#A31515"&gt;1&lt;/font&gt;] = &lt;font color="#A31515"&gt;"http://localhost/wp/Images/{0}.jpg"&lt;/font&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine(&lt;font color="#A31515"&gt;@"Запускаем&amp;nbsp;первый&amp;nbsp;тест&amp;nbsp;для&amp;nbsp;разогрева&amp;nbsp;сервера..."&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Test(&lt;font color="#A31515"&gt;10&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine(&lt;font color="#A31515"&gt;@"А&amp;nbsp;теперь&amp;nbsp;уже&amp;nbsp;основной&amp;nbsp;тест..."&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Test(&lt;font color="#A31515"&gt;1000&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.ReadKey();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;static void&lt;/font&gt; Test(&lt;font color="#0000ff"&gt;int&lt;/font&gt; iterationCount) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_measures = &lt;font color="#0000ff"&gt;new&lt;/font&gt;[] { &lt;font color="#0000ff"&gt;new long&lt;/font&gt;[iterationCount], &lt;font color="#0000ff"&gt;new long&lt;/font&gt;[iterationCount] };&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; pass = &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;; pass &amp;lt; &lt;font color="#A31515"&gt;2&lt;/font&gt;; pass++) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine(&lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(&lt;font color="#A31515"&gt;"Тестируем&amp;nbsp;url:&amp;nbsp;{0}"&lt;/font&gt;, _urls[pass]));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = &lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;; i &amp;lt; iterationCount; i++) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;string&lt;/font&gt; id = Rand.Next(&lt;font color="#A31515"&gt;&amp;nbsp;0&lt;/font&gt;, &lt;font color="#A31515"&gt;4999&lt;/font&gt;).ToFixedLengthString(&lt;font color="#A31515"&gt;5&lt;/font&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_measures[pass][i] = MakeMeasurement(&lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(_urls[pass], id));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine(&lt;font color="#0000ff"&gt;string&lt;/font&gt;.Format(&lt;font color="#A31515"&gt;"Количество&amp;nbsp;проходов:&amp;nbsp;{1},&amp;nbsp;Среднее&amp;nbsp;время:&amp;nbsp;{0}&amp;nbsp;ms"&lt;/font&gt;, _measures[pass].Average(), iterationCount));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;static long&lt;/font&gt; MakeMeasurement(&lt;font color="#0000ff"&gt;string&lt;/font&gt; url) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;var&lt;/font&gt; client = &lt;font color="#0000ff"&gt;new&lt;/font&gt; System.Net.&lt;font color="#2b91af"&gt;WebClient&lt;/font&gt;();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Stopwatch&lt;/font&gt;.Reset();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Stopwatch&lt;/font&gt;.Start();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client.DownloadData(url);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;Stopwatch&lt;/font&gt;.Stop();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2b91af"&gt;GC&lt;/font&gt;.Collect();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; &lt;font color="#2b91af"&gt;Stopwatch&lt;/font&gt;.ElapsedMilliseconds;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;private static string&lt;/font&gt; ToFixedLengthString(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#2b91af"&gt;Int32&lt;/font&gt; &lt;font color="#0000ff"&gt;value&lt;/font&gt;, &lt;font color="#0000ff"&gt;int&lt;/font&gt; length) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;string&lt;/font&gt; strValue = &lt;font color="#0000ff"&gt;value&lt;/font&gt;.ToString();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;if&lt;/font&gt; (strValue.Length &amp;lt; length)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; &lt;font color="#2b91af"&gt;Math&lt;/font&gt;.Pow(10f, (length - strValue.Length)).ToString().Substring(&lt;font color="#A31515"&gt;1&lt;/font&gt;) + strValue;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;return&lt;/font&gt; strValue;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;/ol&gt;&lt;/font&gt;&lt;/code&gt;&lt;/blockquote&gt; Честно говоря результаты меня озадачили...  &lt;br /&gt;  &lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em" href="http://1.bp.blogspot.com/_pkXux0Jk51I/SwmYJ-1K0xI/AAAAAAAAB28/UOnFRnXmuxI/s1600/snap1.png" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_pkXux0Jk51I/SwmYJ-1K0xI/AAAAAAAAB28/UOnFRnXmuxI/s320/snap1.png" width="320" height="161" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;br /&gt;  &lt;br /&gt;Во время отладки делались прогоны по 10 итераций, и второй вариант стабильно оказывался в 2 раза быстрее первого, однако после выполнения полного теста с 1000 итераций, оказалось что разница по времени составляет примерно 2,5 мс в пользу второго варианта...  &lt;br /&gt;Тут я обратил внимание на количество свободной памяти, которое составляло примерно 100-150 Мб.. пришлось закрыть все лишнее, освободив при этом еще примерно 300 Мб. Т.е. перед вторым запуском было примерно 400-450 Мб свободной памяти...  &lt;br /&gt;  &lt;br /&gt;Результаты второго теста оказались для меня неожиданными..  &lt;br /&gt;  &lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em" href="http://4.bp.blogspot.com/_pkXux0Jk51I/SwmYXNw90rI/AAAAAAAAB3A/mmnKIAdH8JU/s1600/snap2.png" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_pkXux0Jk51I/SwmYXNw90rI/AAAAAAAAB3A/mmnKIAdH8JU/s320/snap2.png" width="320" height="161" /&gt;&lt;/a&gt;&lt;/div&gt; Как видно на рисунке, первый вариант стал работать быстрее на 10 с лишним миллисекунд. Однако стоит заметить, что увеличение свободной памяти практически не повлияло на время получения файла с диска..   &lt;br /&gt;  &lt;br /&gt;Потом я решил проверить как изменится результат с уменьшением количества файлов..  &lt;br /&gt;Сначала уменьшил количество до 50 000:  &lt;br /&gt;  &lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em" href="http://2.bp.blogspot.com/_pkXux0Jk51I/Swm9ynpgcEI/AAAAAAAAB3E/2Gat9qKa4CE/s1600/snap3.PNG" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_pkXux0Jk51I/Swm9ynpgcEI/AAAAAAAAB3E/2Gat9qKa4CE/s320/snap3.PNG" width="320" height="161" /&gt;&lt;/a&gt;&lt;/div&gt; Разница сократилась, но незначительно...   &lt;br /&gt;  &lt;br /&gt;Потом до 20 000:  &lt;br /&gt;  &lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em" href="http://2.bp.blogspot.com/_pkXux0Jk51I/Swm9-YfVqnI/AAAAAAAAB3I/dfpbclGgR7Q/s1600/snap4_20.PNG" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_pkXux0Jk51I/Swm9-YfVqnI/AAAAAAAAB3I/dfpbclGgR7Q/s320/snap4_20.PNG" width="320" height="161" /&gt;&lt;/a&gt;&lt;/div&gt; Тут уже оба варианта показали одинаковую производительность   &lt;br /&gt;  &lt;br /&gt;И наконец до 5 000:  &lt;br /&gt;  &lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em" href="http://3.bp.blogspot.com/_pkXux0Jk51I/Swm-KI3weKI/AAAAAAAAB3M/5MuxIQ2cfU8/s1600/snap5_5.PNG" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_pkXux0Jk51I/Swm-KI3weKI/AAAAAAAAB3M/5MuxIQ2cfU8/s320/snap5_5.PNG" width="320" height="161" /&gt;&lt;/a&gt;&lt;/div&gt; Тут уже первый вариант стал работать медленнее, а второй, по производительности, ушел далеко вперед.   &lt;br /&gt;  &lt;br /&gt;Дальше уменьшать количество файлов, по моему, не имело смысла, поскольку тенденция налицо.  &lt;br /&gt;Итак, какие выводы можно сделать по результатам этого теста?  &lt;br /&gt;Файловая система не всегда работает быстрее базы данных. До проведения теста, я был уверен, что, по крайней мере с такой операцией как поиск и считывание файла по полному пути, она справляется быстрее... По правде говоря я не могу себе представить сценарий, в котором потребуется скидывать в одну папку сто тысяч файлов, однако меня уверяли что такое возможно...  &lt;br /&gt;База данных выигрывает по отношению к файловой системе за счет большего использования памяти, на скорость получения файлов с диска увеличение доступной памяти никак не повлияло. Учитывая ограничения, которые выдвигают хостеры для виртуальных серверов, хранение файлов на диске мне кажется более предпочтительным. Но в то же время, если есть реальная необходимость хранить большое количество файлов на одном уровне, и имеется собственный сервер, использование базы данных в качестве хранилища может дать лучший результат.  &lt;br /&gt;На мой взгляд тест не мешало бы расширить, добавив в него варианты с параллельными запросами не только на получение файлов, но и также на получение другой информации из БД. Такая ситуация будет более приближена к реальным условиям, и в этом случае, как мне кажется, база данных поведет себя значительно хуже...    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3292493590960629250-6305993321700997342?l=alex.algel.name' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alex.algel.name/feeds/6305993321700997342/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alex.algel.name/2009/11/web.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/6305993321700997342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3292493590960629250/posts/default/6305993321700997342'/><link rel='alternate' type='text/html' href='http://alex.algel.name/2009/11/web.html' title='Хранение изображений на web-сервере БД или ФС?'/><author><name>algel</name><uri>http://www.blogger.com/profile/01266074436759408164</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_pkXux0Jk51I/SwmYJ-1K0xI/AAAAAAAAB28/UOnFRnXmuxI/s72-c/snap1.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
