<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=288359&amp;view=findpost&amp;p=3604204</guid>
        <pubDate>Tue, 02 Jun 2015 05:31:30 +0000</pubDate>
        <title>Сага о WPF Binding часть первая</title>
        <link>https://forum.sources.ru/index.php?showtopic=288359&amp;view=findpost&amp;p=3604204</link>
        <description><![CDATA[vlkam: Просто огроменное спасибо&#33; Перерыл 2 толстнные книги и гугл, потратил 2 дня, прочитал Ваш пост и наконец то понял, в чем была засада. <br>Спасибо &#33;]]></description>
        <author>vlkam</author>
        <category>.NET FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=288359&amp;view=findpost&amp;p=2435036</guid>
        <pubDate>Sat, 28 Nov 2009 22:24:42 +0000</pubDate>
        <title>Сага о WPF Binding часть первая</title>
        <link>https://forum.sources.ru/index.php?showtopic=288359&amp;view=findpost&amp;p=2435036</link>
        <description><![CDATA[Pit-Bul: На самом деле Binding очень хорошая и полезная штука, и ничего в нем сложного и особенного. В этой статье я попробую описать простой пример  его использования или применения, называйте как хотите.<br>
     <br>
<br>
 <span class='tag-size' data-value='14' style='font-size:14pt;'><strong class='tag-b'>Binding, что это такое и для чего он нужен.</strong></span><br>
<br>
   Во первых Binding это привязка данных, это просто и думаю все это прекрасно понимают и ни для кого это не станет откровением. Но не все понимают что с чем привязывается и зачем это надо, ну так давайте попробуем в этом разобраться. Первая и самая главная полезность которую мы получаем при использовании Binding&#39;ов это разделение понятий отображения и логики, то есть грубо говоря мы имеем некую &quot;морду&quot; которую мы показываем пользователю и логику данных которая спрятана за этой &quot;мордой&quot;. Так вот, начнем с простого примера, как все начинают :) . <br>
<br>
Код окна <br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&#60;Window x:Class=&quot;WpfBinding.SampleBinding&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Title=&quot;SampleBinding&quot; Height=&quot;300&quot; Width=&quot;300&quot; Loaded=&quot;Window_Loaded&quot;&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#60;Grid&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#60;Grid.RowDefinitions&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;RowDefinition Height=&quot;Auto&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;RowDefinition Height=&quot;Auto&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;RowDefinition Height=&quot;Auto&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;RowDefinition Height=&quot;*&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;RowDefinition Height=&quot;Auto&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#60;/Grid.RowDefinitions&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#60;TextBox Name=&quot;helloBox&quot; Text=&quot;{Binding TextData}&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#60;Button Name=&quot;helloBtn&quot; Grid.Row=&quot;4&quot; Width=&quot;100&quot; Content=&quot;Hello&quot; Click=&quot;helloBtn_Click&quot; HorizontalAlignment=&quot;Right&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#60;/Grid&#62;</div><div class="code_line">&#60;/Window&#62;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
и соответственно код нашей логики данных, то биш SampleBinding.cs файл<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">using System.Windows;</div><div class="code_line">&nbsp;</div><div class="code_line">namespace WpfBinding</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;/// &#60;summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/// Interaction logic for SampleBinding.xaml</div><div class="code_line">&nbsp;&nbsp; &nbsp;/// &#60;/summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public partial class SampleBinding </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public SampleBinding()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;InitializeComponent();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public string TextData { get; set; }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private void helloBtn_Click(object sender, RoutedEventArgs e)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TextData = &quot;Hello&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private void Window_Loaded(object sender, RoutedEventArgs e)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TextData = &quot;Click Hello button&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
что нам надо, при старте программы загрузить в helloBox строку &quot;Click Hello button&quot; а по нажатию кнопки поменять текст на &quot;Hello&quot;, вроде бы все просто, но после запуска программы мы видим что ничего не работает. Почему скажите вы, ведь у нас есть строка <em class='tag-i'>Text=&quot;{Binding TextData}&quot;</em> которая должна была обеспечить нам привязку,  а потому что просто привязка ничего не значит, ведь мы не указали окну откуда брать данные, привязка есть но с чем не сказано. Мы должны дать нашему окну DataContext к данным которого мы будем привязывать поля нашей формы. DataContext у нас есть, и даже более того судя по строчке <em class='tag-i'>Window x:Class=&quot;WpfBinding.SampleBinding&quot;</em> он уже связан с нашим окном, но все-же чтобы завершить привязку немного модифицируем наш код следующим образом.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&#60;Window x:Class=&quot;WpfBinding.SampleBinding&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Title=&quot;SampleBinding&quot; Height=&quot;300&quot; Width=&quot;300&quot; Loaded=&quot;Window_Loaded&quot; Name=&quot;sampleWindow&quot;&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#60;Grid&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#60;Grid.RowDefinitions&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;RowDefinition Height=&quot;Auto&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;RowDefinition Height=&quot;Auto&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;RowDefinition Height=&quot;Auto&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;RowDefinition Height=&quot;*&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;RowDefinition Height=&quot;Auto&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#60;/Grid.RowDefinitions&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#60;TextBox Name=&quot;helloBox&quot; Text=&quot;{Binding ElementName=sampleWindow, Path=TextData}&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#60;Button Name=&quot;helloBtn&quot; Grid.Row=&quot;4&quot; Width=&quot;100&quot; Content=&quot;Hello&quot; Click=&quot;helloBtn_Click&quot; HorizontalAlignment=&quot;Right&quot;/&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#60;/Grid&#62;</div><div class="code_line">&#60;/Window&#62;</div></ol></div></div></div></div><br>
<br>
Рассмотрим что изменилось в коде окна. А изменилось то что мы дали имя sampleWindow классу нашего окна и сказали текстовому полю что брать данные надо из элемента с именем sampleWindow по пути TextData, по сути задав ему этим самым DataContext. Но и этого пока не достаточно потому как при инициализации окна когда после создания элементов инициализируются привязки в TextData не заданно значение и мы привязываемся к пустому полю. Так как же быть, как сообщить окну, или даже не окну, а текстовому полю что данные в нашем классе логики изменились. Для этого нам понадобиться тот волшебный интерфейс про который я не раз вспоминал отвечая на вопросы по привязке данных в топиках нашего форума и который так никто и не хочет видеть в упор, речь идет о INotifyPropertyChanged из System.ComponentModel. Что он нам дает, а дает он нам единственное событие которое посылает окну PropertyChangedEventArgs извещая о том что поменялось поле обнови данные. И вот как будет выглядеть код SampleBinding.cs после модификации<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">using System.ComponentModel;</div><div class="code_line">using System.Windows;</div><div class="code_line">&nbsp;</div><div class="code_line">namespace WpfBinding</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;/// &#60;summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/// Interaction logic for SampleBinding.xaml</div><div class="code_line">&nbsp;&nbsp; &nbsp;/// &#60;/summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public partial class SampleBinding : INotifyPropertyChanged</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public SampleBinding()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;InitializeComponent();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private string textData;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public string TextData</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;get { return textData; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;set</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;textData = value;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;OnPropertyChanged(&quot;TextData&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private void helloBtn_Click(object sender, RoutedEventArgs e)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TextData = &quot;Hello&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private void Window_Loaded(object sender, RoutedEventArgs e)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TextData = &quot;Click Hello button&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#region Implementation of INotifyPropertyChanged</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public event PropertyChangedEventHandler PropertyChanged;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public void OnPropertyChanged(string propertyName)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (PropertyChanged != null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PropertyChanged(this, new PropertyChangedEventArgs(propertyName));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#endregion</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Рассмотрим что что мы имеем. В результате реализации INotifyPropertyChanged как я говорил раньше мы получаем событие <em class='tag-i'>public event PropertyChangedEventHandler PropertyChanged</em> предающее окну сообщение с именем поля класса данных в котором произошли изменения данных благодаря чему окно может обновить свое отображение. Так вот получается что не так уж много надо для успешного применения привязки данных, а именно: окно с элементами которые знают откуда и как брать данные и логика умеющая своевременно сообщить о том что данные изменились...<br>
<br>
<span class='tag-size' data-value='14' style='font-size:14pt;'><strong class='tag-b'>Продолжение следует ................</strong></span>]]></description>
        <author>Pit-Bul</author>
        <category>.NET FAQ</category>
      </item>
	
      </channel>
      </rss>
	