我有一个非常大的ControlTemplate(200多行),里面有许多嵌套控件。我需要重复使用这个模板,只需对这些嵌套控件之一进行小的更改(复选框的可见性)。显然,我不想复制粘贴到新的ControlTemplate中,只是进行更改,因为我会将代码库加倍,如果我对模板进行常规更改,我需要更改它们。
我已经想过三个似乎可以工作的解决方案,但我对XAML知之甚少(尤其是重构XAML以了解这些是否可行)
将常见的XAML解压缩到基础ControlTemplate中并“覆盖”两个新ControlTemplates中的复选框可见性(我将覆盖放在引号中,因为我正在使用C#说话 - 我不知道这是否有意义XAML!)
从ControlTemplate定义的外部访问复选框(通过x:名称或x:键可能),然后设置可见性将是微不足道的。
在ControlTemplate中为Visibilty指定某种绑定,如:
<Checkbox Visibility={Binding someNewPropertyOfTheTemplate}/>
(这是使用TemplateBinding的吗?)
这些想法中的任何一个都有效吗?如果是这样,哪个最合适? (如果不是 - 正确的方法是什么?)
我正在使用带有.Net 4.0的VS2010。
答案 0 :(得分:3)
我会去#3。但是你的代码不太正确。如果要绑定到实际控件的属性,应用哪个模板,则应使用TemplateBinding
。假设您有一个带有属性ShowCheckboxes
的自定义控件。然后在你的模板中你应该使用
<Checkbox Visibility={TemplateBinding ShowCheckboxes,
Converter={StaticResource BooleanToVisibilityConverter}}/>
注意,您可能需要参考或创建适当的转换器。
另一方面,如果使用MVVM,则可以在viewmodel类上定义控件属性。然后你应该使用{Binding}
。
此外,还有另一种方法可以控制应用哪些模板。
您可以从大模板中提取子控件的模板。并复制它,因此您有两个模板,这些模板在您需要的方式上有所不同。
然后,在主模板中,您可以将TemplateSelector
设置为您要实现的自定义类的子控件。有关更多示例,请查看http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx。