3

我有一个这样的 JibGrid DataGrid(JibGrid 是标准 DataGrid 的开源相对简单的子类,用于实现过滤等内容):

<dataGrid:JibGrid ItemsSource="{Binding AvailableRDs}" 
                            FilteredItemsSource="{Binding AvailableRDs}"
                            SelectedItem="{Binding SelectedAvailRD}" 
                            AutoGenerateColumns="False" >
    <dataGrid:JibGrid.Columns>
        <DataGridCheckBoxColumn Header="Add?" Binding="{Binding Add}" Visibility="{Binding GetAddVisibility}"/>
        <DataGridTextColumn Header="Tag" Binding="{Binding Tag}" />
        <DataGridTextColumn Header="Revision Tag" Binding="{Binding RevisionTag}" />
        <DataGridTextColumn Header="Current System" Binding="{Binding SystemStr}" />
    </dataGrid:JibGrid.Columns>
</dataGrid:JibGrid>

目的是为每一行提供一个自定义类,为该行中每个单元格的内容提供属性 - Tag、RevisionTag 等。所有这些都可以正常工作。我无法工作的是可见性绑定。如果在 DataContext 中表示该行的类上的 CanAdd 属性返回 False,我希望每行中的复选框不可见。当我如上所述在 XAML 中添加 Visibility 绑定时,似乎发生的情况是 WPF 尝试将此绑定应用于实际列而不是每一行,因此绑定无法连接。我可以使用 WPF 资源管理器并手动将行的复选框可见性 DependencyProperty 绑定到行的数据上下文的 CanAdd 属性,这工作正常,但我不知道如何在 XAML 或代码中,使其自动为每一行中的复选框生成该绑定。有人对此有任何想法吗?

我已经搜索过这样的问题,似乎出于某种原因,每个人都想根据整个网格的数据上下文中的某些内容来更改列本身的可见性,而没有其他人想更改其中的内容的可见性基于该行的数据上下文的单个行。当我试图弄清楚这一点时,我在这里尝试了解决方案,这就是该答案试图做的。

4

1 回答 1

3

您可以使用DataGridTemplateColumnandBooleanToVisibilityConverter来达到预期的效果

添加BooleanToVisibilityConverter到您的资源

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVis"/>
</Window.Resources>

Converter为 DataGridTemplateColumn 绑定设置

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding Add}"
                      Visibility="{Binding CanAdd, Converter={StaticResource BoolToVis}}" ></CheckBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>   
于 2013-09-25T02:44:19.530 回答