在 ControlTemplate 中覆盖属性

5
我有一个非常大的ControlTemplate(200+行),里面有许多嵌套控件。我需要重用此模板,并对其中一个嵌套控件进行小修改(复选框的可见性)。显然,我不想将其复制粘贴到新的ControlTemplate中并进行更改,因为这会使代码库翻倍,如果我对模板进行了公共更改,则需要同时更改两个模板。

我考虑了三个解决方案,似乎它们都可以工作,但是我不了解足够的XAML(尤其是重构XAML)来知道这些是否可行

  1. 将常见的XAML提取到基础ControlTemplate中,并在两个新的ControlTemplates中“覆盖”复选框的可见性(我使用C#讲话-我不知道在XAML中是否有意义!)

  2. 从ControlTemplate定义外部访问复选框(通过x:Name或x:Key),那么设置Visibility将是微不足道的。

  3. 在ControlTemplate中指定一种绑定方式,例如:

    <Checkbox Visibility={Binding someNewPropertyOfTheTemplate}/> (这是TemplateBinding的用途吗?)

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

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

1个回答

3

我会选择方案 #3。但你的代码并不是完全正确的。如果你想绑定实际控件的属性,应该使用TemplateBinding。假设你有一个带有属性ShowCheckboxes的自定义控件。那么在模板中,你应该使用

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

请注意,您可能需要引用或创建适当的转换器。如果您使用MVVM,您可以在视图模型类上定义控件属性。然后您应该使用{Binding}
此外,还有另一种控制应用哪些模板的方法。您可以将子控件的模板从大模板中提取出来,并复制它,这样您就有了两个模板,它们在所需的方式上不同。然后,在主模板中,您可以为子控件设置TemplateSelector到您实现的自定义类中。更多示例,请参见http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx

谢谢!我最近在另一个答案中遇到了你的两行代码,但在这个问题和答案之外,它们没有意义。你的解释很有帮助。 - Alan Baljeu
但是 ShowCheckBoxes 应该在哪里声明,如何设置呢? - Alan Baljeu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接