【问题标题】:DataTemplate check if Binding existDataTemplate 检查 Binding 是否存在
【发布时间】:2026-02-21 15:10:01
【问题描述】:

我在 ResourceDictionary 中将按钮样式设置为 DataTemplate。这里是一小部分:

    <Style TargetType="{x:Type Button}">
    <Setter Property="Focusable" Value="False"></Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="border">
                    ...
                </Border>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding IsSelected}" Value="True">
                        <Setter Property="Background" TargetName="border" Value="Red" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

在此模板中,有一个绑定到属性 IsSelected。此属性在一种情况下存在,而在另一种情况下则不存在。

如果绑定路径存在,是否可以检查 Xaml,然后在其他情况下使用它忘记它? 现在我在 Debug 输出中有 BindingExpression,我想消除它。

【问题讨论】:

    标签: c# wpf xaml data-binding datatemplate


    【解决方案1】:

    更相关的问题是:为什么你的ControlTemplate 中有一个DataTrigger?这会在控件与其数据上下文之间产生依赖关系,这就是当您的数据上下文与控件模板的预期不匹配时您会遇到此问题的原因。

    您确定不能使用更合适的机制吗?例如,您能否为那些IsSelected 应该影响Background 的按钮使用一种样式?

    <Style x:Key="SpecialButtonStyle" TargetType="Button">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsSelected}" Value="True">
                <Setter Property="Background" Value="Red" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
    
    ...
    
    <Button DataContext="relevant data context" Style="{StaticResource SpecialButtonStyle}"/>
    

    或者,更好的是,您能否为您拥有的具有IsSelected 属性的特定数据类定义一个数据模板?此数据模板可以自动使用正确的Button 样式。

    【讨论】:

    • 我如何才能访问 TargetName 边框?哪个是另一种风格?这可能吗?
    • 你没有。相反,您更新控件模板然后绑定到的控件上的属性。这在数据和该数据的可视化之间提供了清晰的分离。在这种情况下,您可以让样式触发器设置ButtonBackground 属性。然后,按钮控件模板中的 border 元素将使用 TemplateBinding 到按钮的 Background 属性。