Прив’язка до колекції Windows Runtime

При привязці простих властивостей зазвичай не виникає проблем Але от привязка колекцій вимагає додаткових зусиль

Розширимо клас Employee, перевантаживши метод ToString:

public override string ToString()

{

return StringFormat(&quot{0} {1}&quot, firstName, lastName)

}

Цей метод нам знадобиться при заповненні одного з елементів управління колекцією елементів типу Employee

Хочу відразу зазначити, що колекції здатні приймати тільки ті елементи, які є спадкоємцями ItemsControl Серед таких елементів можна виділити і ListBox, Що здатний відображати список елементів

Перш ніж писати код, давайте визначимося з властивостями, які використовуються при привязці колекції до елементу Тут існують три властивості:

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp ItemsSource    -Задає колекцію елементів Якщо не заданий DisplayMemberPath, То кожен елемент спробує викликати метод ToString Ось чому ми й зумовили ToString

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp ItemTemplate   – Використовується для завдання шаблону відображення конкретного елемента

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp DisplayMemberPath – Задає конкретне властивість для відображення в елементі керування

А ось тепер перейдемо до коду Спочатку розширимо наш інтерфейс, відобразивши

ListBox:

&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:data=&quotusing:Chapter5_Binding&quot&gt

&ltStackPanel&gt

&ltListBox Height=&quot300&quot Name=&quotlstEmp&quot&gt&lt/ListBox&gt

&ltGrid x:Name=&quotLayoutRoot&quot Background=&quotWhite&quot Width=&quot400&quot DataContext=&quot{Binding SelectedItem, ElementName=lstEmp}&quot&gt

&ltGridRowDefinitions&gt

&ltRowDefinition Height=&quotAuto&quot&gt&lt/RowDefinition&gt

&ltRowDefinition Height=&quotAuto&quot&gt&lt/RowDefinition&gt

&ltRowDefinition Height=&quotAuto&quot&gt&lt/RowDefinition&gt

&ltRowDefinition Height=&quotAuto&quot&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 Path=FirstName}&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 Path=LastName}&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 Path=EMail}&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 Path=Age}&quot  GridRow=&quot3&quot GridColumn=&quot1&quot&gt

&lt/TextBox&gt

&lt/Grid&gt

&lt/StackPanel&gt

&lt/Page&gt

Зверніть увагу на те, що контекст для форми з детальними даними ми вибираємо з елемента ListBox, Використовуючи привязку

Тепер реалізуємо код, який створює список елементів В якості структури даних можна вибрати будь-який клас – головне, щоб він реалізовував інтерфейс IEnumerable

protected override void OnNavigatedTo(NavigationEventArgs e)

{

List&ltEmployee&gt employeeList = new List&ltEmployee&gt()

Employee emp = new Employee() empFirstName = &quotSergiy" empLastName = &quotBaydachnyy" empEMail = &quotsbaidachni@gmailcom" empAge = 31

employeeListAdd(emp) emp = new Employee()

empFirstName = &quotSergii"

empLastName = &quotLutai"

empEMail = &quotsergiilutai@dctua" empAge = 27

employeeListAdd(emp)

lstEmpItemsSource = employeeList

}

Як бачите, ми створили два елементи і виконали привязку до елементу ListBox,

отримавши повністю робочий приклад

Результат роботи програми можна побачити на малюнку нижче:

Рис 51

Проте якщо Ви спробуєте змінити конкретний елемент через його детальну форму, то зможете побачити, що введені зміни зберігаються, але ListBox вперто не хоче їх відображати Це все від того, що ListBox реагує лише на зміну значень тільки тих властивостей, з якими він повязаний явно Тобто, якщо ми міняємо властивість LastName, то ініціюється подія OnPropertyChange, Але ListBox  ніякого діла до нього немає, так як він використовує метод ToString і не повязаний з конкретною властивістю (або властивості) Щоб виправити ситуацію, можна скористатися методомDisplayMemberPath, Вказавши імя властивості явно Вся справа в тому, що ми хочемо відобразити комбінацію імені та прізвища, а такої властивості у нас немає Визначати ж нову властивість було б нерозумно Тому ми скористаємося можливістю ListBox  визначити шаблон видаваних елементів, заповнивши властивість ItemTemplate Ось як виглядатиме елемент ListBox:

&ltListBox Height=&quot300&quot Width=&quot400&quot Name=&quotlstEmp&quot&gt

&ltListBoxItemTemplate&gt

&ltDataTemplate&gt

&ltBorder Background=&quotGray&quot BorderThickness=&quot2&quot CornerRadius=&quot10&quot Width=&quot396&quot Height=&quot30&quot&gt

&ltStackPanel Orientation=&quotHorizontal&quot Margin=&quot5&quot&gt

&ltTextBlock Text=&quot{Binding FirstName}&quot&gt&lt/TextBlock&gt

&ltTextBlock Text=&quot &quot&gt&lt/TextBlock&gt

&ltTextBlock Text=&quot{Binding LastName}&quot&gt&lt/TextBlock&gt

&lt/StackPanel&gt

&lt/Border&gt

&lt/DataTemplate&gt

&lt/ListBoxItemTemplate&gt

&lt/ListBox&gt

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

На завершення розділу слід зазначити, що замість класуList   краще використовувати колекцію ObservableCollection Справа в тому, що якщо Ви вирішите додавати або видаляти елементи зі списку, то зіткнетеся з необхідністю реалізації інтерфейсу INotifyCollectionChanged А ObservableCollection вже реалізує цей інтерфейс

Сергій Лутай, Сергій Байдачний, 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>

*

*