样式DataTrigger参考父控件的类型

Pet*_*erE 8 .net wpf xaml binding styles

在我的窗口上有几个GroupBox控件,每个控件包含一个网格控件.对于那些我希望设计风格的网格.但只对那些直接位于GroupBox中的网格,所有其他网格都不应受到影响.

我尝试了以下,但不起作用,因为GetType()不是属性.

<Style TargetType="Grid">
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Parent.GetType()}" Value="{x:Type GroupBox}">
           <!-- <Setter Property="..." Value="..."/> -->
        </DataTrigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

我找到了一个解决方法,但它并不是一个非常漂亮的解决方案,因为我必须修改GroupBoxes:

<Style TargetType="GroupBox">
    <Setter Property="Tag" Value="blub"/>
 </Style>
<Style TargetType="Grid">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=Parent.Tag, RelativeSource={RelativeSource Mode=Self}}" Value="blub">
           <!-- <Setter Property="..." Value="..."/> -->
        </DataTrigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

显然我可以手动设置每个Grid的样式,但我试图避免这种情况,因为它们中有很多.我希望你能找到一种方法让第一个例子起作用.

Naw*_*waz 7

<DataTrigger Binding="{Binding Path=Parent.Tag, RelativeSource={RelativeSource Mode=Self}}" Value="blub">
Run Code Online (Sandbox Code Playgroud)

这段代码不起作用,因为Mode的类型实际上是BindingMode,它是一个Enumeration,它的成员都不是Self.所以这个赋值Mode = Self在你的代码中是错误的.要了解Mode的可能值,请单击此按钮.

写这个的正确方法是,

<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}, Path=Tag}" Value="blub">
Run Code Online (Sandbox Code Playgroud)

当然,要实现这一点,您必须保留已经编写的GroupBox的Style.


小智 5

这对我有用:

        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StatusBar}}, Path=DependencyObjectType.Name}" Value="StatusBar">
                <Setter Property="Margin" Value="0"/>
                <Setter Property="Padding" Value="0"/>
                <Setter Property="Background" Value="Chartreuse"/>
            </DataTrigger>
        </Style.Triggers>
Run Code Online (Sandbox Code Playgroud)

它允许您根据父类型设置样式,而不必求助于标签,标签实际上应该由代码而不是标记使用。