如何在WPF中对DataTemplate应用样式触发器

16

我有以下的代码...

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

问题在于你不能像我试图在DataTemplate内部这样应用Style.Trigger。那么我的问题是,如何创建一种触发器,以便基于父级更改DataTemplate上的属性?

最终解决方案:

我采取了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>
1个回答

18

如何让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>

1
足够接近(我的祖先是一个组合框而不是一个分组框..并且标签中对我没有任何价值的值) - Shane Courtrille
抱歉,我在我的环境中进行测试时忘记在发布之前删除了GroupBox和Tag的内容。很高兴它对你有用 :) - Souvik Basu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接