Настройка отображения данных с привязкой данных и WPF - Работа с шаблонами

ОГЛАВЛЕНИЕ

Работа с шаблонами

Эффективный интерфейс пользователя представляет необработанные данные таким образом, что пользователь может интуитивно извлечь их них осмысленную информацию. В этом и состоит суть визуализации данных. Привязка данных – лишь одна часть головоломки визуализации данных. Все программы WPF, кроме самых тривиальных, требуют способа представления данных с более широкими возможностями, чем простая привязка одного свойства на элементе управления к одному свойству на объекте данных. Реальные объекты данных имеют множество относящихся к ним свойств, и эти различные свойства должны сходиться в цельное визуальное представление. По этой причине у WPF и имеются шаблоны данных.

Класс System.Windows.DataTemplate – лишь одна из форм шаблона в WPF. В целом, шаблон – это формочка для выпечки печенья, которую инфраструктура WPF использует, чтобы создавать визуальные элементы, помогающие в визуализации объектов, не имеющих собственного визуального представления. Когда элемент пытается отобразить объект, не имеющий такого представления, скажем, нестандартный бизнес-объект, можно указать элементу, как визуализировать объект, дав ему DataTemplate.
DataTemplate может создать столько визуальных элементов, сколько необходимо для отображения объекта данных. Эти элементы используют привязки данных для отображения значении свойств объекта данных. Если элементу неизвестно, как отображать объект, который ему указано визуализировать, он просто вызывает метод ToString на нем и отображает результаты в TextBlock.

Предположим, что у нас имеется простой класс, именуемый FullName, в котором хранится имя некоего лица. Необходимо отобразить список имен, в котором фамилия каждого лица выделялась бы по сравнению с прочим. Чтобы сделать это, можно создать шаблон DataTemplate, описывающий, как визуализовать объект FullName. Код, показанный наРис. 1, отображает класс FullName и фоновый код для окна, в котором отобразится список имен.

Рис. 1. Отображение объектов FullName с помощью DataTemplate

public class FullName
{
   public string FirstName { get; set; }
   public char MiddleInitial { get; set; }
   public string LastName { get; set; }
}

public partial class WorkingWithTemplates : Window
{
   // This is the Window's constructor.
   public WorkingWithTemplates()
   {
     InitializeComponent();

     base.DataContext = new FullName[]
     {
       new FullName 
       { 
         FirstName = "Johann", 
         MiddleInitial = 'S', 
         LastName = "Bach" 
       },
       new FullName 
       { 
         FirstName = "Gustav",
         MiddleInitial = ' ',
         LastName = "Mahler" 
       },
       new FullName 
       { 
         FirstName = "Alfred", 
         MiddleInitial = 'G', 
         LastName = "Schnittke" 
       }
     };
   }
}

Как можно увидеть наРис. 2, в файле XAML окна имеется элемент управления ItemsControl. Он создает простой список элементов, которые пользователь не может выбирать или удалять. У элемента ItemsControl имеется наблон DataTemplate, присвоенный его свойству ItemTemplate, с помощью которого он визуализирует каждый экземпляр FullName, созданный в конструкторе окна. Можно заметить, что у большинства элементов TextBlock в DataTemplate свойство Text («Текст») привязано к представляемым ими свойствам объекта FullName.

Рис. 2. Отображение объектов FullName с помощью DataTemplate

<!-- This displays the FullName objects. -->
<ItemsControl ItemsSource="{Binding Path=.}">
  <ItemsControl.ItemTemplate>
   <DataTemplate>
    <StackPanel Orientation="Horizontal">
     <TextBlock FontWeight="Bold" Text="{Binding LastName}" />
     <TextBlock Text=", " />
     <TextBlock Text="{Binding FirstName}" />
     <TextBlock Text=" " />
     <TextBlock Text="{Binding MiddleInitial}" />
    </StackPanel>
   </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

При запуске этого демонстрационного приложения оно выглядит, как показано наРис. 3. Использование DataTemplate для визуализации имени позволяет легко выделить фамилию каждого лица, поскольку параметр шрифта FontWeight соответствующего TextBlock является полужирным. Этот простой пример демонстрирует суть взаимоотношений между привязкой данных WPF и шаблонами. По мере углубления в тему я буду совмещать эти функции, создавая способы визуализации сложных объектов со все более широкими возможностями.

 

Рис. 3. Объекты FullName, визуализованные DataTemplate