【问题标题】:How do I bind the visibility of a CheckBox in a DataGrid to the DataContext of that row?如何将 DataGrid 中 CheckBox 的可见性绑定到该行的 DataContext?
【发布时间】:2013-09-24 22:46:31
【问题描述】:

我有一个这样的 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>

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

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

【问题讨论】:

    标签: wpf binding wpfdatagrid


    【解决方案1】:

    你可以使用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>   
    

    【讨论】:

    • 切换到 DataGridTemplateColumn 似乎解决了我的问题。但是,我的解决方案不需要 BooleanToVisibility 转换器,因为 CanAdd 属性已经返回 Visibility。
    • 发现另一个问题,IsChecked 绑定必须更改为 IsChecked="{Binding Add, UpdateSourceTrigger=PropertyChanged}" 才能正常工作。我还将 CanAdd 重命名为 GetAddVisibility 以提高清晰度。
    • 如果您的 ViewModel 实现了INotifyPropertyChanged,则无需在 Binding 上设置 UpdateSourceTrigger=PropertyChanged
    • 我的虚拟机已经实现了INotifyPropertyChanged,删除UpdateSourceTrigger 仍然会导致在选中该框时绑定不更新源。我认为您倒退了-我的理解是INotifyPropertyChanged 用于通知视图在视图以外的其他内容更改它时再次获取绑定值。就像 ViewModel 更新了 Add 布尔值一样,它会触发 View 显示新值。使 View 更新 ViewModel 是单独的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2013-11-16
    • 2015-11-02
    相关资源
    最近更新 更多