- •«Комп’ютерні технології та програмування»
- •Оглавление
- •Лабораторная работа 1 Знакомство с wpf
- •Теоретические сведения
- •1. Знакомство с редактором xaml
- •2.Создание приложения wpf
- •Контрольные вопросы
- •Лабораторная работа 2 Подробное введение в разработку приложений wpf
- •Теоретические сведения
- •1. Ознакомление с управлением проектами wpf в msVisualStudio
- •3) Создание обработчиков событий
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •2. Создание тестового приложения wpf
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 3 Макет программы и основные элементы управления
- •Теоретически сведения
- •1. Макет в wpf
- •2. Новые возможности wpf
- •3. Элемент управления Canvas
- •4. Элементуправления StackPanel
- •5. Элементуправления WrapPanel
- •6. Элемент управления DockPanel
- •7. Элемент Grid
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 4
- •Xaml и код, расширения разметки и ресурсы
- •Теоретически сведения
- •2. Ссылки на ресурсы в wpf
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 6 Свойства зависимости
- •Теоретически сведения
- •1. Особенности свойств clr
- •2. Наследование значений свойств зависимости
- •3. Присоединенные свойства
- •4. Метаданныесвойствзависимости
- •5. Проверка допустимости значения
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 7 Привязка данных
- •Теоретически сведения
- •1. Концепция привязки данных
- •2. Свойство DataContext
- •3. Основные понятия привязки данных
- •4. Синтаксис привязки данных
- •5. Привязка к элементам интерфейса пользователя
- •6. Привязка к xml
- •7. Привязка к коллекции
- •8. Преобразователи значений привязки данных
- •9. Проверкапривязкиданных
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
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.
