如何将样式触发器应用于 WPF 中的数据模板

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6260571/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 22:54:23  来源:igfitidea点击:

How to apply style trigger to datatemplate in WPF

wpftriggersdatatemplatetemplating

提问by Shane Courtrille

I've got the following..

我有以下..

<ComboBox Grid.Row="2" Grid.Column="2" Grid.RowSpan="2" ItemsSource="{Binding ShipperAddresses}" Text="{Binding ShipperAddress}" Margin="85,2,0,2">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBox AcceptsReturn="True" Width="200" Height="100"/>
            <DataTemplate.Resources>
                <Style TargetType="{x:Type TextBox}">
                    <Setter Property="IsReadOnly" Value="True">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}, Path=Tag}" Value="False"/>
                    </Style.Triggers>
                    </Setter>
                </Style>
            </DataTemplate.Resources>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

The problem is that you can't apply a Style.Trigger like I'm trying to do inside a DataTemplate. So my question is how would you apply create a trigger so that a property on the DataTemplate changes based on the parent?

问题是你不能像我试图在 DataTemplate 中那样应用 Style.Trigger。所以我的问题是您将如何应用创建触发器,以便 DataTemplate 上的属性根据父级进行更改?

FINAL SOLUTION:

最终解决方案:

I took what Souvik gave me and fixed it up since there were a few problems. Here is the end result.

我拿走了 Souvik 给我的东西并修复了它,因为有一些问题。这是最终结果。

 <ComboBox Grid.Row="2" Grid.Column="2" Grid.RowSpan="2" ItemsSource="{Binding ShipperAddresses}" Text="{Binding ShipperAddress}" DisplayMemberPath="Value" Margin="85,2,0,2">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBox AcceptsReturn="True" Width="200" Height="100" Text="{Binding Path=Value}"/>
                    <DataTemplate.Triggers>
                       <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=IsEditable}" Value="False">
                          <Setter Property="IsEnabled" Value="False"/>
                        </DataTrigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </ComboBox.ItemTemplate>
            <ComboBox.Resources>
                <Style TargetType="{x:Type ComboBox}">
                    <Setter Property="IsEditable" Value="True"/>
                    <Style.Triggers>
                        <Trigger Property="IsDropDownOpen" Value="True" >
                            <Setter Property="IsEditable" Value="False"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>

            </ComboBox.Resources>

采纳答案by Souvik Basu

Have DataTemplate trigger instead of Style trigger:

有 DataTemplate 触发器而不是 Style 触发器:

<ComboBox Grid.Row="2" Grid.Column="2" Grid.RowSpan="2" ItemsSource="{Binding ShipperAddresses}" Text="{Binding ShipperAddress}" Margin="85,2,0,2">
    <ComboBox.ItemTemplate> 
        <DataTemplate>
            <TextBox AcceptsReturn="True" Width="200" Height="100"/>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}, Path=Tag}" Value="False">
                    <Setter Property="IsEnabled" Value="False"/>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>