DataGridTextColumn上的DataTrigger

时间:2012-04-10 12:20:02

标签: wpf wpf-4.0

我正在尝试在我的一个组合框元素上附加一个数据触发器。触发器应该读取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(所有类型的列)上的附加属性处理所有功能。

1 个答案:

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