简体   繁体   English

使用DataTrigger绑定到样式中的Self

[英]Binding to Self in Style with DataTrigger

I have a Style for a Button. 我有一个按钮样式。 Depending on if the Button is enabled or not, I want to change the Background. 根据Button是否启用,我想更改背景。 This is what it looks like: 这就是它的样子:

<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>

This is just a basic example. 这只是一个基本的例子。 Actually I need a MultiDataTrigger, but it's not even working with a regular DataTrigger. 实际上我需要一个MultiDataTrigger,但它甚至不能使用常规的DataTrigger。 All I see is a gray button. 我只看到一个灰色按钮。

This is the trace: 这是跟踪:

System.Windows.Data Warning: 56 : Created BindingExpression (hash=31767240) for Binding (hash=6303779) System.Windows.Data警告:56:为绑定创建BindingExpression(hash = 31767240)(hash = 6303779)
System.Windows.Data Warning: 58 : Path: 'IsEnabled' System.Windows.Data警告:58:路径:'IsEnabled'
System.Windows.Data Warning: 60 : BindingExpression (hash=31767240): Default mode resolved to OneWay System.Windows.Data警告:60:BindingExpression(hash = 31767240):默认模式已解析为OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=31767240): Default update trigger resolved to PropertyChanged System.Windows.Data警告:61:BindingExpression(hash = 31767240):解析为PropertyChanged的默认更新触发器
System.Windows.Data Warning: 62 : BindingExpression (hash=31767240): Attach to System.Windows.Controls.Button.NoTarget (hash=24311680) System.Windows.Data警告:62:BindingExpression(hash = 31767240):附加到System.Windows.Controls.Button.NoTarget(hash = 24311680)
System.Windows.Data Warning: 66 : BindingExpression (hash=31767240): RelativeSource (FindAncestor) requires tree context System.Windows.Data警告:66:BindingExpression(hash = 31767240):RelativeSource(FindAncestor)需要树上下文
System.Windows.Data Warning: 65 : BindingExpression (hash=31767240): Resolve source deferred System.Windows.Data警告:65:BindingExpression(hash = 31767240):解析源延迟
System.Windows.Data Warning: 67 : BindingExpression (hash=31767240): Resolving source System.Windows.Data警告:67:BindingExpression(hash = 31767240):解析源
System.Windows.Data Warning: 70 : BindingExpression (hash=31767240): Found data context element: (OK) System.Windows.Data警告:70:BindingExpression(hash = 31767240):找到数据上下文元素:(确定)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Grid (hash=35377238) System.Windows.Data警告:73:查找类型Button的祖先:查询网格(哈希= 35377238)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried ContentPresenter (hash=51189900) System.Windows.Data警告:73:查找类型Button的祖先:查询ContentPresenter(hash = 51189900)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Border (hash=48541090) System.Windows.Data警告:73:查找类型Button的祖先:查询边框(hash = 48541090)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried StartStopControl (hash=22721178) System.Windows.Data警告:73:查找类型Button的祖先:查询StartStopControl(hash = 22721178)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Grid (hash=32321338) System.Windows.Data警告:73:查找类型Button的祖先:查询网格(哈希= 32321338)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried ContentPresenter (hash=31184590) System.Windows.Data警告:73:查找类型Button的祖先:查询ContentPresenter(hash = 31184590)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Border (hash=37117888) System.Windows.Data警告:73:查找类型Button的祖先:查询边框(hash = 37117888)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried MenuPanelControl (hash=873549) System.Windows.Data警告:73:查找类型Button的祖先:查询MenuPanelControl(hash = 873549)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Grid (hash=29953511) System.Windows.Data警告:73:查找类型Button的祖先:查询网格(哈希= 29953511)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried ContentPresenter (hash=42576376) System.Windows.Data警告:73:查找类型Button的祖先:查询ContentPresenter(hash = 42576376)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried AdornerDecorator (hash=66649760) System.Windows.Data警告:73:查找类型Button的祖先:查询AdornerDecorator(hash = 66649760)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Border (hash=23566381) System.Windows.Data警告:73:查找类型Button的祖先:查询边框(哈希= 23566381)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried MainWindow (hash=38392424) System.Windows.Data警告:73:查找类型Button的祖先:查询MainWindow(hash = 38392424)

It looks like it goes through the whole visual tree, starting with the Grid where the Button is placed in. Why does it not start with the Button? 看起来它贯穿整个可视化树,从放置Button的Grid开始。为什么它不以Button开头?

Why don't you change it to Trigger? 你为什么不把它改成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>

Or if you want to use it anyway, you don't need to find an ancestor, because you're currently on the button: 或者如果你想要使用它,你不需要找到一个祖先,因为你当前在按钮上:

  <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>

If it doesn't help you, you should give more details: Original XAML code and maybe your View Model's code too. 如果它对您没有帮助,您应该提供更多详细信息:原始XAML代码以及您的View Model代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM