Переопределение свойства в ControlTemplate - PullRequest
4 голосов
/ 29 ноября 2011

У меня очень большой шаблон ControlTemplate (более 200 строк) со множеством вложенных элементов управления внутри. Мне нужно повторно использовать этот шаблон с небольшим изменением одного из этих вложенных элементов управления (видимость флажка). Очевидно, что я не хочу копировать-вставлять в новый ControlTemplate и просто вносить это изменение, потому что я удвою базу кода, и если я внесу общее изменение в шаблон, мне нужно будет изменить оба.

Я подумал о трех решениях, которые, похоже, могут работать, но я недостаточно знаю о XAML (и особенно о рефакторинге XAML, чтобы узнать, возможны ли они)

  1. Извлеките общий XAML в базовый ControlTemplate и «переопределите» видимость флажка в двух новых ControlTemplate (я помещаю переопределение в цитаты, потому что я использую язык C # - я понятия не имею, имеет ли это смысл XAML!)

  2. Получить доступ к флажку (через x: Name или x: Key возможно) вне определения ControlTemplate, тогда установка Visibility будет тривиальной.

  3. Укажите некоторую привязку Visibilty в ControlTemplate, что-то вроде:

    <Checkbox Visibility={Binding someNewPropertyOfTheTemplate}/> (Это то, для чего используется TemplateBinding?)

Являются ли какие-либо из этих идей действительными? И если да, то что является наиболее подходящим? (Если нет - как правильно?)

Я использую VS2010 с .Net 4.0.

1 Ответ

3 голосов
/ 29 ноября 2011

Я бы пошел на # 3. Но твой код не совсем правильный. Если вы хотите привязать к свойствам фактического элемента управления, к которому применяется шаблон, вы должны использовать TemplateBinding. Предположим, у вас есть пользовательский элемент управления со свойством ShowCheckboxes. Тогда в вашем шаблоне вы должны использовать

<Checkbox Visibility={TemplateBinding ShowCheckboxes, 
                      Converter={StaticResource BooleanToVisibilityConverter}}/>

Обратите внимание, что вам, возможно, придется сослаться или создать соответствующий конвертер. С другой стороны, если вы используете MVVM, вы можете определить свое свойство control в классе viewmodel. Тогда вы должны использовать {Binding}.

Кроме того, есть еще один способ контролировать, какие шаблоны применяются. Вы можете извлечь шаблон для вашего субконтроля из большого шаблона. И скопируйте его, чтобы у вас было два шаблона, которые отличаются тем, как вам нужно. Затем в основном шаблоне вы можете установить TemplateSelector для вашего субконтроля в пользовательский класс, который вы будете реализовывать. Посмотрите на http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx для большего количества примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...