我正试图在我的一个combobox元素上附加一个数据工具。触发器应该读取DataGridTextColumn (combobox的祖先)的附加属性,并在此基础上作出决定。现在的问题是,DataGridTextColumn不是视觉树的一部分,所以我不能通过RelativeSource祖先获得它。这是示例代码。
<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 (所有类型的列)上附加的属性,过滤器将处理所有功能。
发布于 2012-04-10 19:42:17
我在评论中的意思是,您可以在绑定到的属性上触发,而不是在标头上触发。因为如果您响应标头更改,则必须触发标头,这是很好的,但在您的模型上,这可以是您响应的相同属性,只有在不同的位置。
此外,您也不能在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>https://stackoverflow.com/questions/10088672
复制相似问题