覆盖ControlTemplate中的属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了覆盖ControlTemplate中的属性相关的知识,希望对你有一定的参考价值。

我有一个非常大的ControlTemplate(200多行),里面有许多嵌套控件。我需要重复使用这个模板,只需对这些嵌套控件之一进行小的更改(复选框的可见性)。显然,我不想复制粘贴到新的ControlTemplate中,只是进行了更改,因为我将加倍代码库,如果我对模板进行常见更改,我需要更改它们。

我已经想过三个似乎可以工作的解决方案,但我对XAML知之甚少(尤其是重构XAML以了解这些是否可行)

  1. 将公共XAML提取到基础ControlTemplate中并“覆盖”两个新ControlTemplates中的复选框可见性(我将覆盖放在引号中,因为我正在使用C#说话 - 我不知道这在XAML中是否有意义!)
  2. 从ControlTemplate定义的外部访问复选框(通过x:Name或x:Key可能),然后设置Visibility将是微不足道的。
  3. 在ControlTemplate中的Visibility上指定某种绑定,类似于: <Checkbox Visibility={Binding someNewPropertyOfTheTemplate}/>(这是使用TemplateBinding的吗?)

这些想法是否有效?如果是这样,哪个最合适? (如果不是 - 这是正确的方法吗?)

我正在使用带有.Net 4.0的VS2010。

答案

我会去#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了解更多示例。

以上是关于覆盖ControlTemplate中的属性的主要内容,如果未能解决你的问题,请参考以下文章

WPF:有没有办法在不重新定义整个样式的情况下覆盖 ControlTemplate 的一部分?

使用 ControlTemplate 在用户控件上绑定自定义依赖属性

WPF ControlTemplate

背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素(代码片

[UWP]如何使用代码创建DataTemplate(或者ControlTemplate)

ControlTemplate 中 Bingding 附加属性时需要加入 Path