Прив’язка до об’єкта Windows Runtime

На практиці значно частіше доводиться виконувати привязку елементів до даних, які містяться в обєкті деякого класу Ці дані можуть бути отримані з бази даних або згенеровані під час роботи додатку

Створимо простий клас, що описує інформацію про співробітника:

public class Employee

{

public string FirstName

{

get set

}

public string LastName

{

get set

}

public string EMail

{

get set

}

public int Age

{

get set

}

}

Цей клас містить 4 властивості з модифікатором public Це основна вимога при привязці до даних: властивості обєктів, які виступають в якості джерела, повинні бути загальнодоступними

Наступний код створює просту форму і повязує цю форму з обєктом типу Employee, який ми визначили в ресурсах (аналогічно можна визначити і в коді):

&ltPage x:Class=&quot Chapter5_BindingMainPage &quot xmlns=&quothttp://schemasmicrosoftcom/winfx/2006/xaml/presentation&quot xmlns:x=&quothttp://schemasmicrosoftcom/winfx/2006/xaml&quot xmlns:d=&quothttp://schemasmicrosoftcom/expression/blend/2008&quot xmlns:mc=&quothttp://schemasopenxmlformatsorg/markup-compatibility/2006&quot xmlns:local=&quotusing:Element_Binding_Sample&quot&gt

&ltPageResources&gt

&ltlocal:Employee x:Key=&quotemployee&quot Age=&quot27&quot FirstName=&quotSergii&quot LastName=&quotLutai&quot EMail=&quotsergiilutai@dctua&quot /&gt

&lt/PageResources&gt

&ltGrid x:Name=&quotLayoutRoot&quot Width=&quot400&quot&gt

&ltGridRowDefinitions&gt

&ltRowDefinition&gt&lt/RowDefinition&gt

&ltRowDefinition&gt&lt/RowDefinition&gt

&ltRowDefinition&gt&lt/RowDefinition&gt

&ltRowDefinition&gt&lt/RowDefinition&gt

&lt/GridRowDefinitions&gt

&ltGridColumnDefinitions&gt

&ltColumnDefinition&gt&lt/ColumnDefinition&gt

&ltColumnDefinition&gt&lt/ColumnDefinition&gt

&lt/GridColumnDefinitions&gt

&ltTextBlock Text=&quotFirst Name:&quot GridRow=&quot0&quot GridColumn=&quot0&quot&gt

&lt/TextBlock&gt

&ltTextBox Text=&quot{Binding FirstName, Source={StaticResource employee}, Mode=TwoWay}&quot

GridRow=&quot0&quot GridColumn=&quot1&quot&gt

&lt/TextBox&gt

&ltTextBlock Text=&quotLast Name:&quot GridRow=&quot1&quot GridColumn=&quot0&quot&gt

&lt/TextBlock&gt

&ltTextBox Text=&quot{Binding LastName, Source={StaticResource employee}, Mode=TwoWay}&quot

GridRow=&quot1&quot GridColumn=&quot1&quot&gt

&lt/TextBox&gt

&ltTextBlock Text=&quotEMail:&quot GridRow=&quot2&quot GridColumn=&quot0&quot&gt

&lt/TextBlock&gt

&ltTextBox Text=&quot{Binding EMail, Source={StaticResource employee}, Mode=TwoWay}&quot

GridRow=&quot2&quot GridColumn=&quot1&quot&gt

&lt/TextBox&gt

&ltTextBlock Text=&quotAge:&quot GridRow=&quot3&quot GridColumn=&quot0&quot&gt

&lt/TextBlock&gt

&ltTextBox Text=&quot{Binding Age, Source={StaticResource employee}, Mode=TwoWay}&quot

GridRow=&quot3&quot GridColumn=&quot1&quot&gt

&lt/TextBox&gt

&lt/Grid&gt

&lt/Page&gt

Як бачите, механізм точно такий, як і при привязці до елементів Тільки замість ElementName використовується властивість Source, Яке задає посилання на обєкт (у даному випадку обираний з ресурсів)

Модифікуємо код вище, використовуючи ще одну корисну властивість – DataContext:

&ltPage x:Class=&quotChapter5_BindingMainPage&quot xmlns=&quothttp://schemasmicrosoftcom/winfx/2006/xaml/presentation&quot xmlns:x=&quothttp://schemasmicrosoftcom/winfx/2006/xaml&quot xmlns:d=&quothttp://schemasmicrosoftcom/expression/blend/2008&quot xmlns:mc=&quothttp://schemasopenxmlformatsorg/markup-compatibility/2006&quot xmlns:local=&quotusing:Element_Binding_Sample&quot&gt

&ltPageResources&gt

&ltlocal:Employee x:Key=&quotemployee&quot Age=&quot27&quot FirstName=&quotSergii&quot LastName=&quotLutai&quot EMail=&quotsergiilutai@dctua&quot /&gt

&lt/PageResources&gt

&ltGrid x:Name=&quotLayoutRoot&quot Width=&quot400&quot DataContext=&quot{StaticResource employee}&quot&gt

&ltGridRowDefinitions&gt

&ltRowDefinition&gt&lt/RowDefinition&gt

&ltRowDefinition&gt&lt/RowDefinition&gt

&ltRowDefinition&gt&lt/RowDefinition&gt

&ltRowDefinition&gt&lt/RowDefinition&gt

&lt/GridRowDefinitions&gt

&ltGridColumnDefinitions&gt

&ltColumnDefinition&gt&lt/ColumnDefinition&gt

&ltColumnDefinition&gt&lt/ColumnDefinition&gt

&lt/GridColumnDefinitions&gt

&ltTextBlock Text=&quotFirst Name:&quot GridRow=&quot0&quot GridColumn=&quot0&quot&gt

&lt/TextBlock&gt

&ltTextBox Text=&quot{Binding FirstName, Mode=TwoWay}&quot GridRow=&quot0&quot GridColumn=&quot1&quot&gt

&lt/TextBox&gt

&ltTextBlock Text=&quotLast Name:&quot GridRow=&quot1&quot GridColumn=&quot0&quot&gt

&lt/TextBlock&gt

&ltTextBox Text=&quot{Binding LastName, Mode=TwoWay}&quot GridRow=&quot1&quot GridColumn=&quot1&quot&gt

&lt/TextBox&gt

&ltTextBlock Text=&quotEMail:&quot GridRow=&quot2&quot GridColumn=&quot0&quot&gt

&lt/TextBlock&gt

&ltTextBox Text=&quot{Binding EMail, Mode=TwoWay}&quot GridRow=&quot2&quot GridColumn=&quot1&quot&gt

&lt/TextBox&gt

&ltTextBlock Text=&quotAge:&quot GridRow=&quot3&quot GridColumn=&quot0&quot&gt

&lt/TextBlock&gt

&ltTextBox Text=&quot{Binding Age, Mode=TwoWay}&quot GridRow=&quot3&quot GridColumn=&quot1&quot&gt

&lt/TextBox&gt

&lt/Grid&gt

&lt/Page&gt

Як Ви бачите, нам трохи вдалося спростити код Справа в тому, що якщо не вказати імя обєкта з даними явно, то механізм привязки починає перебір властивостей DataContext всіх батьківських елементів, поки не знайде непорожній Знайдений DataContext механізм скріплення і використовується як джерело

Зауваження Якщо Ви будете використовувати DataContext в коді, то клас Employee повинен бути тільки public При використанні через ресурси можна обійтися і без public

Отже, з першого погляду, наш код працює правильно і цілком прогнозовано Але, якщо Ви спробуєте змінити хоча б одну властивість обєкта типу Employee в коді, то виявите, що значення у відповідному поле не помінялося Так, приберіть DataContext з XAML коду, а замість нього реалізуйте обробник події Loaded:

protected override void OnNavigatedTo(NavigationEventArgs e)

{

Employee emp = new Employee() empFirstName = &quotSergii" empLastName = &quotLutai"

empEMail = &quotsergiilutai@dctua" empAge = 27

LayoutRootDataContext = emp

empFirstName = &quotAlex"

}

Тут ми створюємо обєкт типу Employee, повязуємо його з формою, а потім змінюємо одне з властивостей Якщо запустити це приклад, то можна виявити, що зміни не потрапили у форму Це повязано з тим, що у механізму привязки немає можливості перевіряти значення властивості обєкта з даними При цьому для елементів управління механізм працював нормально, так як базувався на понятті залежних властивостей

Якщо ми хочемо бачити очікувану поведінку, необхідно реалізувати спеціальний інтерфейсINotifyPropertyChanged Реалізація цього інтерфейсу дозволить механізму привязки даних реагувати на подію, повязане із зміною всіх властивостей Правда ініціювати подія доведеться самостійно Ось як виглядатиме клас Employee, який реалізує INotifyPropertyChanged:

public class Employee: INotifyPropertyChanged

{

public event PropertyChangedEventHandler PropertyChanged

public void OnPropertyChanged(PropertyChangedEventArgs e)

{

if (PropertyChanged = null) PropertyChanged(this, e)

}

private string firstName private string lastName private int age

private string email

public string FirstName

{

get { return firstName } set

{

firstName = value

OnPropertyChanged(new PropertyChangedEventArgs(&quotFirstName&quot))

}

}

public string LastName

{

get { return lastName } set

{

lastName = value

OnPropertyChanged(new PropertyChangedEventArgs(&quotLastName&quot))

}

}

public string EMail

{

get { return email } set

{

email = value

OnPropertyChanged(new PropertyChangedEventArgs(&quotEMail&quot))

}

}

public int Age

{

get { return age } set

{

age = value

OnPropertyChanged(new PropertyChangedEventArgs(&quotAge&quot))

}

}

}

Ось тепер додаток буде працювати так, як і очікувалося

Сергій Лутай, Сергій Байдачний, Windows 8 для C # розробників

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*