Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Технология Windows Presentation Foundation.docx
Скачиваний:
0
Добавлен:
05.01.2020
Размер:
962.98 Кб
Скачать

12.2. Шаблоны данных

Шаблон данных – механизм для настройки отображения объектов заданного типа. Любой шаблон данных – это объект System.Windows.DataTemplate. Основное свойство шаблона данных – VisualTree. Оно содержит визуальный элемент, определяющий внешний вид шаблона. При формировании VisualTree обычно используется привязка данных для извлечения информации из объекта, для которого применяется шаблон. Сам шаблон данных, как правило, размещают в ресурсах окна или приложения.

Рассмотрим пример использования шаблонов данных. Пусть имеется объект класса Person, описанный в ресурсах окна и являющийся содержимым окна:

// класс Person объявлен в пространстве имён WpfTemplates

public class Person

{

public string Name { get; set; }

public double Age { get; set; }

}

<Window x:Class="WpfTemplates.MainWindow"

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

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

xmlns:local="clr-namespace:WpfTemplates"

Width="400" Height="160" Title="WPF Templates">

<Window.Resources>

<local:Person x:Key="smith" Name="Mr. Smith" Age="27.3" />

</Window.Resources>

<Window.Content>

<StaticResourceExtension ResourceKey="smith" />

</Window.Content>

</Window>

Рис. 45. Показ объекта Person без шаблона данных.

Определим для Person шаблон данных. У класса DataTemplate имеется свойство DataType, устанавливающее тип, к которому будет применяться шаблон. Если задано это свойство, шаблон будет использоваться в любой ситуации, где нужно отобразить объект.

<!-- остальное описание окна не изменилось -->

<Window.Resources>

<local:Person x:Key="smith" Name="Mr. Smith" Age="27.3" />

<DataTemplate DataType="{x:Type local:Person}">

<Border Name="bord" BorderBrush="Aqua" BorderThickness="2"

CornerRadius="3" Padding="10" Margin="5">

<TextBlock FontSize="20" FontWeight="Bold"

Text="{Binding Name}" />

</Border>

</DataTemplate>

</Window.Resources>

Рис. 46. Показ объекта Person при помощи шаблона.

В шаблон данных можно поместить триггеры данных. Следующий пример показывает использование триггера для того, чтобы изменить цвет окантовки для объектов Person со значением Age=1:

<!-- эта разметка – часть шаблона DataTemplate -->

<DataTemplate.Triggers>

<DataTrigger Binding="{Binding Age}" Value="1">

<Setter TargetName="bord" Property="BorderBrush" Value="Red" />

</DataTrigger>

</DataTemplate.Triggers>

При работе с иерархическими элементами управления (например, TreeView) вместо шаблона данных на основе DataTemplate следует использовать HiererchicalDataTemplate. У такого шаблона имеется свойство ItemsSource, которое нужно связать с дочерней коллекцией, и свойство ItemTemplate – дочерний шаблон данных (DataTemplate или HiererchicalDataTemplate).

13. Списки и представления коллекций

В примерах параграфа будут использоваться классы Person и Repository.

// классы объявлены в пространстве имён Domain

public class Person : INotifyPropertyChanged, IDataErrorInfo

{

private string _name;

private double _age;

public string Name

{

get { return _name; }

set { SetProperty(ref _name, value, "Name"); }

}

public double Age

{

get { return _age; }

set { SetProperty(ref _age, value, "Age"); }

}

public event PropertyChangedEventHandler PropertyChanged;

public string this[string columnName]

{

get

{

switch (columnName)

{

case "Name":

return string.IsNullOrEmpty(Name) ?

"Name cannot be empty" : null;

case "Age":

return Age < 0 ? "Incorrect age" : null;

}

return null;

}

}

public string Error

{

get { return null; }

}

private void SetProperty<T>(ref T field, T value, string name)

{

if (!EqualityComparer<T>.Default.Equals(field, value))

{

field = value;

var handler = PropertyChanged;

if (handler != null)

{

handler(this, new PropertyChangedEventArgs(name));

}

}

}

}

public static class Repository

{

public static List<Person> ReadAll()

{

var trinity = new Person {Name = "Trinity", Age = 32};

var smith = new Person {Name = "Agent Smith", Age = 39};

var brown = new Person {Name = "Agent Brown", Age = 39};

var jones = new Person {Name = "Agent Jones", Age = 39};

var neo = new Person {Name = "Neo", Age = 37};

return new List<Person> {trinity, smith, brown, jones, neo};

}

}