RelativeSource 数据触发器绑定不起作用
RelativeSource data trigger binding not working
我正在尝试将 DataGridTextColumn
的背景颜色设置为另一种颜色(如果它是只读的)。我正在使用以下代码这样做:
<DataGridTextColumn Header="Test" IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsReadOnly, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridTextColumn}}}" Value="True">
<Setter Property="Background" Value="LightGreen"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
我运气不好,但是删除触发器会导致背景始终为浅绿色。数据触发器绑定有问题吗?我对 WPF 比较陌生,但这是我可以在网上找到的。理想情况下,这将在 App.XAML 中,这样它就可以像这样在所有列中工作,那么是否有一种方法可以将其转换为一种样式?谢谢
编辑--------
如果我通过 ElementName 进行绑定,它会起作用:
<DataTrigger Binding="{Binding IsReadOnly, ElementName=stupid}" Value="True">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
不过,如果可能的话,我希望它更通用。再次感谢。
编辑:一开始没有检查 DataGridTextColumn 上的背景 属性。
这回答了你最初的问题 -
<DataGridTextColumn Header="Test" IsReadOnly="True" Binding="{Binding name}" x:Name="MyColumn">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsReadOnly, ElementName=MyColumn}" Value="True">
<Setter Property="Background" Value="Orange" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
要回答您的第二个问题,您要查找的 DataTrigger 绑定是:
<DataTrigger Binding="{Binding IsReadOnly, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}}" Value="True">
在摘要中,查找父 DataGridCell 而不是 DataGridTextColumn。这是因为您尝试设置样式的 TextBlock 实际上不是 DataGridTextColumn 的子项,而是 DataGridTextColumn 的对等项的子项。
我正在尝试将 DataGridTextColumn
的背景颜色设置为另一种颜色(如果它是只读的)。我正在使用以下代码这样做:
<DataGridTextColumn Header="Test" IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsReadOnly, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridTextColumn}}}" Value="True">
<Setter Property="Background" Value="LightGreen"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
我运气不好,但是删除触发器会导致背景始终为浅绿色。数据触发器绑定有问题吗?我对 WPF 比较陌生,但这是我可以在网上找到的。理想情况下,这将在 App.XAML 中,这样它就可以像这样在所有列中工作,那么是否有一种方法可以将其转换为一种样式?谢谢
编辑--------
如果我通过 ElementName 进行绑定,它会起作用:
<DataTrigger Binding="{Binding IsReadOnly, ElementName=stupid}" Value="True">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
不过,如果可能的话,我希望它更通用。再次感谢。
编辑:一开始没有检查 DataGridTextColumn 上的背景 属性。
这回答了你最初的问题 -
<DataGridTextColumn Header="Test" IsReadOnly="True" Binding="{Binding name}" x:Name="MyColumn">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsReadOnly, ElementName=MyColumn}" Value="True">
<Setter Property="Background" Value="Orange" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
要回答您的第二个问题,您要查找的 DataTrigger 绑定是:
<DataTrigger Binding="{Binding IsReadOnly, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}}" Value="True">
在摘要中,查找父 DataGridCell 而不是 DataGridTextColumn。这是因为您尝试设置样式的 TextBlock 实际上不是 DataGridTextColumn 的子项,而是 DataGridTextColumn 的对等项的子项。