Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
course_(Windows&Web).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.68 Mб
Скачать

Шаг 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 TetxBox; if (location != null) { Binding binding = new Binding("Location"); binding.Source = this; binding.Mode = BindingMode.TwoWay; location.SetBinding(TetxBox. TetxProperty, binding); } }

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

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