Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Wpf-АК11.doc
Скачиваний:
6
Добавлен:
01.03.2025
Размер:
3 Мб
Скачать
☆

7. Привязка к коллекции

Как правило, на некотором этапе разработки приложения WPF выполняется привязка к целой коллекции. Сделать это в WPF можно очень просто. Сделать это можно по-разному. Я кратко опишу два способа, но их, естественно, больше. Просто мне нравятся именно эти.

Во-первых не нужно забывать об уведомлениях об изменениях. Вспомните, мы реализовали такие уведомления для отдельных классов с помощью интерфейса INotifyPropertyChanged. Но что делать с коллекциями, содержащими объекты?

Воспользуемся удобным классом ObserverableCollection. Эта коллекция отвечает за уведомление интерфейса пользователя при каждом добавлении элемента в коллекцию и удалении из нее. Однако по-прежнему нужно, чтобы каждый из объектов коллекции обеспечивал собственное уведомление об изменении с помощью интерфейса INotifyPropertyChanged. Благодаря классу ObserverableCollection и классам, реализующим интерфейс INotifyPropertyChanged, мы можем быть уверены, что не пропустим ни одно изменение.

В состав демонстрационного решения входит проект BindingToCollections, который при выполнении выглядит так (рис. 7.4):

Рис. 7.4. Демонстрационная программа

Привязка к такой коллекции выполняется в два счета. Ниже приводится описание двух способов сделать это с помощью элементов ListBox.

Привязка к коллекции в коде программной части. Свойство ItemSource первого списка ListBox задается в коде так.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

using System.Collections.ObjectModel;

namespace BindingToCollections

{

   /// <summary>

   /// Логика взаимодействия для Window1.xaml

   /// </summary>

   public partial class Window1 : Window

   {

       private People people = new People();

       public Window1()

       {

           InitializeComponent();

           people.Add(new Person { PersonName = "Judge Mental" });

           people.Add(new Person { PersonName = "Office Rocker" });

           people.Add(new Person { PersonName = "Sir Real" });

           this.lstBox1.ItemsSource = people;

       }

   }

}

Код XAML, соответствующийэтойпривязке, выглядиттак.

<Window x:Class="BindingToCollections.Window1"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   xmlns:local="clr-namespace:BindingToCollections"

   WindowStartupLocation="CenterScreen"

   Title="Window1" Height="800" Width="800">

   <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">

       <StackPanel Orientation="Vertical">

           <!-- ListBox Source задаетсявкодепрограммнойчасти-->

           <StackPanel Orientation="Vertical">

               <Label Content="ListBox Source Set In Code Behind"

                   Margin="5,0,0,0" FontSize="14" FontWeight="Bold" />

               <ListBox x:Name="lstBox1"/>

           </StackPanel>

       </StackPanel>

   </ScrollViewer>

</Window>

Привязкакколлекциивкоде XAML. Свойство ItemSourceвторого списка ListBox задается в коде XAML так.

<Window x:Class="BindingToCollections.Window1"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   xmlns:local="clr-namespace:BindingToCollections"

   WindowStartupLocation="CenterScreen"

   Title="Window1" Height="800" Width="800">

   <Window.Resources>

       <local:People x:Key="people">

           <local:Person PersonName="Freddy Star"/>

           <local:Person PersonName="Stick Head"/>

       </local:People>

   </Window.Resources>

   <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">

       <StackPanel Orientation="Vertical">

           <!-- ListBox Source задаетсясиспользованиемресурсов -->

           <StackPanel Orientation="Vertical">

               <Label Content="ListBox Source Set By Using Resources"

                   Margin="5,0,0,0" FontSize="14" FontWeight="Bold" />

               <ListBox x:Name="lstBox2"

                   ItemsSource="{Binding Source={StaticResource people}}"/>

           </StackPanel>

       </StackPanel>

   </ScrollViewer>

</Window>

Как видно из кода, экземпляр объекта People находится непосредственно в разделе ресурсов XAML, а у объявленного объекта People есть несколько дочерних объектов типа Person. Все это достигается благодаря анализатору XAML, который знает о том, что дочерние объекты следует добавлять с помощью метода Add() объекта ObserverableCollection.

Все эти примеры приведены исключительно для демонстрации привязки к коллекциям. В продуктивной системе коллекция может относиться к уровню BAL или входить в модель в схеме MVC/MVVM. Мне нужно было быстро и просто донести свою мысль.

Обработка элементов в списке ListBox. Строка BindingToCollection.Persons просто отображается в виде обычного текста.

Очевидно, незапланированный эффект возник потому, что платформа WPF не знает, какие свойства отображать и как они должны быть показаны для объекта Person.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]