使用 DataTrigger 以样式绑定到自身
Binding to Self in Style with DataTrigger
我有一个按钮样式。根据按钮是否启用,我想更改背景。这是它的样子:
<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 Warning: 56 : Created BindingExpression (hash=31767240) for Binding (hash=6303779)
System.Windows.Data Warning: 58 : Path: 'IsEnabled'
System.Windows.Data Warning: 60 : BindingExpression (hash=31767240): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=31767240): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=31767240): Attach to System.Windows.Controls.Button.NoTarget (hash=24311680)
System.Windows.Data Warning: 66 : BindingExpression (hash=31767240): RelativeSource (FindAncestor) requires tree context
System.Windows.Data Warning: 65 : BindingExpression (hash=31767240): Resolve source deferred
System.Windows.Data Warning: 67 : BindingExpression (hash=31767240): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=31767240): Found data context element: (OK)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Grid (hash=35377238)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried ContentPresenter (hash=51189900)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Border (hash=48541090)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried StartStopControl (hash=22721178)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Grid (hash=32321338)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried ContentPresenter (hash=31184590)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Border (hash=37117888)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried MenuPanelControl (hash=873549)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Grid (hash=29953511)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried ContentPresenter (hash=42576376)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried AdornerDecorator (hash=66649760)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Border (hash=23566381)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried MainWindow (hash=38392424)
看起来它遍历了整个可视化树,从放置 Button 的 Grid 开始。为什么不从 Button 开始?
你为什么不把它改成触发器?
<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 代码,也许还有您的视图模型的代码。
我有一个按钮样式。根据按钮是否启用,我想更改背景。这是它的样子:
<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 Warning: 56 : Created BindingExpression (hash=31767240) for Binding (hash=6303779)
System.Windows.Data Warning: 58 : Path: 'IsEnabled'
System.Windows.Data Warning: 60 : BindingExpression (hash=31767240): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=31767240): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=31767240): Attach to System.Windows.Controls.Button.NoTarget (hash=24311680)
System.Windows.Data Warning: 66 : BindingExpression (hash=31767240): RelativeSource (FindAncestor) requires tree context
System.Windows.Data Warning: 65 : BindingExpression (hash=31767240): Resolve source deferred
System.Windows.Data Warning: 67 : BindingExpression (hash=31767240): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=31767240): Found data context element: (OK)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Grid (hash=35377238)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried ContentPresenter (hash=51189900)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Border (hash=48541090)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried StartStopControl (hash=22721178)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Grid (hash=32321338)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried ContentPresenter (hash=31184590)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Border (hash=37117888)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried MenuPanelControl (hash=873549)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Grid (hash=29953511)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried ContentPresenter (hash=42576376)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried AdornerDecorator (hash=66649760)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried Border (hash=23566381)
System.Windows.Data Warning: 73 : Lookup ancestor of type Button: queried MainWindow (hash=38392424)
看起来它遍历了整个可视化树,从放置 Button 的 Grid 开始。为什么不从 Button 开始?
你为什么不把它改成触发器?
<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 代码,也许还有您的视图模型的代码。