覆盖ControlTemplate中的属性
我有一个非常大的ControlTemplate(200多行),里面有很多嵌套控件。我需要重新使用这个模板,对这些嵌套控件(复选框的可见性)进行一些小改动。很明显,我不想复制粘贴到一个新的ControlTemplate中,只需进行更改,因为我将双倍的代码库,如果我对模板进行了常见更改,则需要更改两者。覆盖ControlTemplate中的属性
我已经想到了三种解决方案看起来他们可以工作,但我不知道有足够的了解XAML(尤其是重构XAML知道这些是可能的)
提取共同XAML到一个ControlTemplate的基础中,并在两个新的ControlTemplates中覆盖复选框的可见性(由于我使用的是C#语言,我把重写放在引号中 - 我不知道这在XAML中是否有意义!)
获得访问权限从ControlTemplate定义之外的复选框(通过x:Name或x:Key也许),然后设置Visibility将是微不足道的。
-
指定某种在ControlTemplate中的公开程度结合,是这样的:(?这是什么原因TemplateBinding用于)
<Checkbox Visibility={Binding someNewPropertyOfTheTemplate}/>
是否有任何的这些想法是否有效?如果是这样,哪个最合适? (如果没有 - 什么是正确的方法?)
我使用VS2010与.Net 4.0。
我会去#3。但是你用它不太合适。如果你想绑定到实际控件的属性,在哪个模板上应用,你应该使用TemplateBinding。 假设您拥有一个属性为ShowCheckboxes
的自定义控件。 然后在你的模板,你应该使用
<Checkbox Visibility={TemplateBinding ShowCheckboxes, Converter={StaticResource BooleanToVisibilityConverter}}/>
注意,你必须引用或建立适当的转换器。另一方面,如果您使用MVVM,则可以在viewmodel类上定义控件属性。那么你应该使用{Binding}
。
此外,还有另一种方法来控制应用哪些模板。 您可以从bug模板中为您的子控件提取模板。并复制它,所以你有两个模板,它们在你需要的方式上有所不同。 然后,在主模板中,您可以将TemplateSelector设置为您的子控件的自定义类,您将实现该模板。有关更多示例,请参阅http://msdn.microsoft.com/ru-ru/library/system.windows.controls.datatemplateselector.aspx。