我正在尝试在我的一个组合框元素上附加一个数据触发器。触发器应该读取DataGridTextColumn(组合框的祖先)的附加属性,并根据该属性做出决定。现在问题是DataGridTextColumn不是Visual Tree的一部分所以我不能通过RelativeSource Ancestor获得它。这是示例代码。
<ComboBox Name="cmbFilter" DisplayMemberPath="CategoryName">
<ComboBox.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridTextColumn}},
Path=Header}"
Value="Id">
<Setter Property="Control.Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
任何人都可能建议一些替代
修改
@denis 我真的不明白你的解决方案,所以让我详细解释一下。我正在开发一个适用于所有需要过滤功能的DataGrid的通用过滤器。 DataGrid定义将通过在DataGrid上指定自定义附加属性“IsFilterable”来指定是否要过滤。单个DataGridColum将通过在DataGridColumn上指定“FilterDisplayType”来指定他们想要的过滤器类型(组合框或文本框)。 DataGrid除了上面之外什么都不会知道。然后,过滤器将根据DataGrid和DataGridColumn(所有类型的列)上的附加属性处理所有功能。
答案 0 :(得分:0)
我在评论中的观点是,您可以触发绑定到的属性,而不是标题。因为如果您响应标题更改,则必须触发标题,这很好,但是它可以是您响应的模型上完全相同的属性,仅在差异处。
你也不能在DataGridTextColumn中放一个组合框, 所以你必须要么:
<DataGridComboBoxColumn ItemsSource="{Binding CategoryNameItems}"
DisplayMemberPath="{Binding CategoryName}"
Visibility="{Binding MyVisibilityProperty, Converter={StaticResource BoolToVisibility}}" />
这将隐藏整个列或仅隐藏组合框将其放入CellTemplate:
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding CategoryNameItems}" DisplayMemberPath="{Binding CategoryName}"
Visibility="{Binding MyVisibilityProperty, Converter={StaticResource BoolToVisibility}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>