使用 DataTrigger 以样式绑定到 Self

Posted

技术标签:

【中文标题】使用 DataTrigger 以样式绑定到 Self【英文标题】:Binding to Self in Style with DataTrigger 【发布时间】:2017-01-23 08:26:57 【问题描述】:

我有一个按钮样式。根据按钮是否启用,我想更改背景。这是它的样子:

<Style x:Key="MyButtonStyle" TargetType="Button">
    <Style.Triggers>
        <DataTrigger Binding="Binding RelativeSource=RelativeSource FindAncestor, AncestorType=Button, Path=IsEnabled, PresentationTraceSources.TraceLevel=High" Value="False">
            <Setter Property="Background" Value="Purple"/>
        </DataTrigger>
        <DataTrigger Binding="Binding RelativeSource=RelativeSource FindAncestor, AncestorType=Button, Path=IsEnabled, PresentationTraceSources.TraceLevel=High" Value="True">
            <Setter Property="Background" Value="Yellow"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

这只是一个基本示例。实际上我需要一个 MultiDataTrigger,但它甚至不能与常规 DataTrigger 一起使用。我看到的只是一个灰色按钮。

这是踪迹:

System.Windows.Data 警告:56:为绑定 (hash=6303779) 创建了 BindingExpression (hash=31767240) System.Windows.Data 警告:58:路径:“IsEnabled” System.Windows.Data 警告:60:BindingExpression (hash=31767240):默认模式解析为 OneWay System.Windows.Data 警告:61:BindingExpression (hash=31767240):默认更新触发器解析为 PropertyChanged System.Windows.Data 警告:62:BindingExpression (hash=31767240):附加到 System.Windows.Controls.Button.NoTarget (hash=24311680) System.Windows.Data 警告:66:BindingExpression (hash=31767240):RelativeSource (FindAncestor) 需要树上下文 System.Windows.Data 警告:65:BindingExpression (hash=31767240):解决源延迟 System.Windows.Data 警告:67:BindingExpression (hash=31767240):正在解析源 System.Windows.Data 警告:70:BindingExpression (hash=31767240):找到数据上下文元素:(OK) System.Windows.Data 警告:73:查找按钮类型的祖先:查询的网格 (hash=35377238) System.Windows.Data 警告:73:查找按钮类型的祖先:查询的 ContentPresenter (hash=51189900) System.Windows.Data 警告:73:查找按钮类型的祖先:查询的边框 (hash=48541090) System.Windows.Data 警告:73:查找按钮类型的祖先:查询 StartStopControl (hash=22721178) System.Windows.Data 警告:73:查找按钮类型的祖先:查询的网格 (hash=32321338) System.Windows.Data 警告:73:查找按钮类型的祖先:查询的 ContentPresenter (hash=31184590) System.Windows.Data 警告:73:查找按钮类型的祖先:查询的边框 (hash=37117888) System.Windows.Data 警告:73:查找按钮类型的祖先:查询的 MenuPanelControl (hash=873549) System.Windows.Data 警告:73:查找按钮类型的祖先:查询的网格 (hash=29953511) System.Windows.Data 警告:73:查找按钮类型的祖先:查询的 ContentPresenter (hash=42576376) System.Windows.Data 警告:73:查找按钮类型的祖先:查询的 AdornerDecorator (hash=66649760) System.Windows.Data 警告:73:查找按钮类型的祖先:查询的边框 (hash=23566381) System.Windows.Data 警告:73:查找按钮类型的祖先:查询的 MainWindow (hash=38392424)

看起来好像遍历了整个可视化树,从放置Button的Grid开始。为什么不是从Button开始?

【问题讨论】:

如果我的回答对您有所帮助,如果您不介意,请将复选框标记为“回答”。 【参考方案1】:

为什么不改成Trigger呢?

  <Style x:Key="MyButtonStyle"
           TargetType="Button">
        <Style.Triggers>
            <Trigger Property="IsEnabled"
                     Value="False">
                <Setter Property="Background"
                        Value="Purple" />
            </Trigger>
            <Trigger Property="IsEnabled"
                     Value="True">
                <Setter Property="Background"
                        Value="Yellow" />
            </Trigger>
        </Style.Triggers>
    </Style>

或者如果你想使用它,你不需要找到祖先,因为你当前在按钮上:

  <Style x:Key="MyButtonStyle"
           TargetType="Button">
        <Style.Triggers>
            <DataTrigger Binding="Binding RelativeSource=RelativeSource Self, Path=IsEnabled, PresentationTraceSources.TraceLevel=High"
                         Value="False">
                <Setter Property="Background"
                        Value="Purple" />
            </DataTrigger>
            <DataTrigger Binding="Binding RelativeSource=RelativeSource Self, Path=IsEnabled, PresentationTraceSources.TraceLevel=High"
                         Value="True">
                <Setter Property="Background"
                        Value="Yellow" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

如果对您没有帮助,您应该提供更多详细信息:原始 XAML 代码,也许还有您的 View Model 的代码。

【讨论】:

我需要使用 DataTrigger 因为我还想从我的 ViewModel 访问属性。当我尝试您的第二个示例时,Intellisense 给了我一个错误,但似乎我可以编译和运行它就好了。如果我可以重建错误,我会看看。到目前为止,谢谢。 它可以工作,但 Intellisense 以某种方式将其显示为错误。我想我可以忍受。 @Mr.B 您使用 Trigger 而不是 DataTrigger 的建议对我有用。但知道为什么吗?谢谢

以上是关于使用 DataTrigger 以样式绑定到 Self的主要内容,如果未能解决你的问题,请参考以下文章

使用 DataGrid 内的 DataTrigger 绑定到 DataRowView

消除重复的 DataTrigger 逻辑

多值绑定文本块 DataTrigger 未触发

wpf datatrigger绑定到方法

将 DataTrigger 值绑定到此 DataTemplate 实例

DataTrigger.ExistActions 未触发绑定值“null”