Опубликован: 13.12.2011 | Доступ: свободный | Студентов: 1021 / 34 | Оценка: 4.29 / 4.57 | Длительность: 13:56:00
Лекция 7:

Пользовательские элементы управления

Шаг 3. Оптимизация шаблона элемента управления

В нынешнем виде шаблон элемента управления — адресная форма отвечает всем нуждам, и его можно использовать точно так же, как пользовательский элемент того же назначения. Однако еще остается возможность упрощения этого шаблона за счет удаления некоторых деталей. В данный момент всякий потребитель элемента управления, который пожелает применить специализированный шаблон, будет вынужден возиться с добавлением выражений привязки, чтобы обеспечить продолжение его работы. Это не трудно, но утомительно. Альтернатива состоит в конфигурировании всех выражений привязки в коде инициализации самого элемента управления. В этом случае шаблону не нужно будет указывать эти детали.

Чтобы система заработала, код должен иметь возможность находить нужные ему элементы. Элементы управления (CustomControl) находят требуемые элементы по имени. В результате имена составляющих элементов становятся частью общедоступного интерфейса разрабатываемого элемента управления, а потому должны быть достаточно осмысленными. По существующему соглашению эти имена начинаются с конструкции PART_, за которой следует собственно имя элемента. В этом имени используются начальные заглавные буквы — как в именах свойств. PART_AdressTextBox — хороший выбор для именования элемента — элемент для текстового ввода адреса.

Например, ниже показано, как можно модернизировать Template для создаваемого CustomControl:

<TextBlock Grid.Row="2" Grid.Column="1"
    Text="Location:"/> 
<TextBox Grid.Row="2" Grid.Column="3"
    x:Name="PART_LocationTextBox" />

<TextBlock Grid.Row="3" Grid.Column="1"
    Text="Address1" />
<TextBox Grid.Row="3" Grid.Column="3"
    x:Name="PART_Address1TextBox" />

<TextBox Grid.Row="4" Grid.Column="1"
    Text="Address2"/>
<TextBox Grid.Row="4" Grid.Column="3"
    x:Name="PART_Address2TextBox" />

<TextBlock Grid.Row="5" Grid.Column="1"
    Text="City, State, Zip " />
<TextBox Grid.Row="5" Grid.Column="3"
    x:Name="PART_StateTextBox" />
Манипулирование частями шаблона

Подключить выражения привязки можно было бы при инициализации элемента управления, но существует более удачный подход. Существует выделенный метод OnApplyTemplate( ), который должен быть переопределен, если необходимо осуществлять поиск элемента в шаблоне и присоединять обработчики событий или выражения привязки. В этом методе для нахождения нужного элемента применяется метод GetTemplateChild( ) (унаследованный от FrameworkElement). Если элемент для работы не найден, рекомендованный подход заключается в том, чтобы не делать ничего. Дополнительно можете добавить код, проверяющий, что элемент, если он присутствует, относится к корректному типу, и генерирующий исключение, если это не так. (Идея в том, что отсутствие элемента говорит о сознательном исключении определенного средства, в то время как некорректный тип элемента представляет ошибку.)

Ниже показано, как подключить выражение привязки данных к отдельному TextBox в методе OnApplyTemplate():

public override void OnApplyTemplate () 
{ 
    base.OnApplyTemplate (); 
    TextBox location = GetTemplateChild("PART_LocationTextBox") as TextBox;
    
    if (location != null)
    {
        Binding binding = new Binding("Location");
        binding.Source = this;
        binding.Mode = BindingMode.TwoWay;
        location.SetBinding(TextBox. TextProperty, binding);
    }
}

В переопределенной функции OnApplyTemplate() мы имеем возможность подписаться на события (например события из прошлого примера – Ctrl+M). Но не забываем, что предварительно необходимо задать имя элементу управления, в его Template, на событие которого мы хотим подписаться.

Документирование частей шаблона

Остался еще последний штрих, который должен быть добавлен к рассматриваемому примеру. В руководствах по проектированию рекомендуется добавлять атрибут TemplatePart к объявлению элемента управления, чтобы документировать используемые в шаблоне имена частей и типы элементов, применяемых для каждой части. Формально этот шаг не является необходимым, но это — фрагмент документации, которая поможет другим разработчикам в использовании вашего класса (и которая может также применяться инструментами визуального проектирования вроде Expression Blend, позволяющими строить специализированные шаблоны элемента управления).

Ниже приведены атрибуты TemplatePart, которые потребуется добавить к классу элемента управления AdressCustomControl:

[TemplatePart(Name="PART_RedSlider", Type=typeof(RangeBase))] 
[TemplatePart(Name = "PART_BlueSlider", Type=typeof(RangeBase))] 
[TemplatePart(Name="PART_GreenSlider", Type=typeof(RangeBase))] 
public class ColorPicker : System.Windows.Controls.Control 
{ ... } 

Ключевые термины

UserControl - предоставляет простой способ создания элемента управления.

CustomControl – это класс унаследованный от UserControl, который содержит набор полей и методов, а также свое представление в виде XAML, которые обеспечивают работу этого контрола. Затем этот контрол может встраиваться в другую страницу (он же самый UserControl).

DataContext – получает или задает контекст данных для объекта FrameworkElement, когда он участвует в привязке данных.

DependencyProperty – представляет свойство, которое можно задать с использованием методов (например, стили, привязка данных, анимация и наследование).

Бизнес-объект (доменные объекты) — это объекты в объектно-ориентированных компьютерных программах, выражающие сущности из модели предметной области, относящейся к программе, и реализующие бизнес-логику программы. Например, программа, управляющая заказами, может содержать такие доменные объекты, как "заказ", "позиция заказа", "счёт-фактура".

Краткие итоги

Мы рассмотрели разработку пользовательского элемента управления. Вы увидели, как строятся базовые пользовательские элементы управления (UserControl), а также как устроен "золотой стандарт" — основанные на шаблонах элементы, лишенные внешнего вида (CustomControl).

Набор для практики

Вопросы:

  1. Назовите основные особенности UserControl
  2. Назовите основные особенности CustomControl
  3. DependencyProperty и этапы определения
  4. Виды привязок в шаблоне пользовательского элемента управления
  5. Назначение метода OnApplyTemplate