覆盖 ControlTemplate 中的属性

Ric*_*chK 5 silverlight wpf xaml

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

我想到了三种似乎可行的解决方案,但我对 XAML 的了解还不够(尤其是重构 XAML 来知道这些是否可行)

  1. 将通用 XAML 提取到基本 ControlTemplate 中,并“覆盖”两个新 ControlTemplate 中的复选框可见性(我将覆盖放在引号中,因为我使用的是 C# 语言 - 我不知道这在 XAML 中是否有意义!)

  2. 从 ControlTemplate 定义外部访问该复选框(可能通过 x:Name 或 x:Key),然后设置可见性将很简单。

  3. 在 ControlTemplate 中指定 Visibilty 上的某种绑定,例如:

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

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

我正在使用 VS2010 和 .Net 4.0。

Vla*_*lov 3

我会选择#3。但你的代码不太正确。如果要绑定到正在应用模板的实际控件的属性,则应该使用TemplateBinding. 假设您有一个带有属性的自定义控件ShowCheckboxes。然后在你的模板中你应该使用

<Checkbox Visibility={TemplateBinding ShowCheckboxes, 
                      Converter={StaticResource BooleanToVisibilityConverter}}/>
Run Code Online (Sandbox Code Playgroud)

请注意,您可能必须引用或创建适当的转换器。另一方面,如果您使用 MVVM,您可以在 viewmodel 类上定义控件属性。那么你应该使用{Binding}.

此外,还有另一种方法可以控制应用哪些模板。您可以从大模板中提取子控件的模板。复制它,这样你就有了两个模板,它们的方式与你需要的不同。然后,在主模板中,您可以将TemplateSelector子控件设置为您将实现的自定义类。有关更多示例,请参阅http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx