如何将DataGrid中CheckBox的可见性绑定到该行的DataContext?

时间:2013-09-24 22:46:32

标签: wpf binding wpfdatagrid

我有一个像这样的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中的Row的类的CanAdd属性返回False,我希望每行中的复选框不可见。当我在上面的XAML中添加Visibility绑定时,似乎发生的情况是WPF尝试将此绑定应用于实际列而不是每行,因此绑定无法连接。我可以使用WPF资源管理器并手动将行的复选框可见性DependencyProperty绑定到Row的datacontext的CanAdd属性,并且工作正常,但我无法弄清楚如何在XAML或代码中导致它生成该绑定自动选中每一行的复选框。有人对此有任何想法吗?

我一直在寻找这样的问题,似乎每个人都希望根据整个网格的datacontext中的某些内容来改变列本身的可见性,而没有其他人想要更改可见性基于该行的datacontext的各行中的事物。我尝试解决这个问题时尝试了解决方案here,这就是答案所要做的。

1 个答案:

答案 0 :(得分:3)

您可以使用DataGridTemplateColumnBooleanToVisibilityConverter来获得所需的结果

BooleanToVisibilityConverter添加到您的资源

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

为DataGridTemplateColumn绑定设置Converter

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding Add}"
                      Visibility="{Binding CanAdd, Converter={StaticResource BoolToVis}}" ></CheckBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>