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(所有类型的列)上的上述附加属性来处理所有功能。

4

1 回答 1

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>
于 2012-04-10T19:42:17.397 回答