gpt4 book ai didi

wpf - 覆盖 ControlTemplate 中的属性

转载 作者:行者123 更新时间:2023-12-03 18:11:47 24 4
gpt4 key购买 nike

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

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

  • 将通用 XAML 提取到基本 ControlTemplate 中并“覆盖”两个新 ControlTemplate 中的复选框可见性(我将覆盖放在引号中,因为我使用的是 C# 语言 - 我不知道这在 XAML 中是否有意义!)
  • 从 ControlTemplate 定义之外访问复选框(可能通过 x:Name 或 x:Key),然后设置 Visibility 将是微不足道的。
  • 在 ControlTemplate 中的 Visibilty 上指定某种绑定(bind),例如:
    <Checkbox Visibility={Binding someNewPropertyOfTheTemplate}/>(这就是 TemplateBinding 的用途吗?)

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

    我正在使用 .Net 4.0 的 VS2010。

    最佳答案

    我会去#3。但是您的代码并不完全正确。如果你想绑定(bind)到实际控件的属性,在哪个模板上应用,你应该使用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更多示例。

    关于wpf - 覆盖 ControlTemplate 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8308910/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com