【问题标题】:Hide column in UWP DataGrid隐藏 UWP DataGrid 中的列
【发布时间】:2021-02-09 04:27:36
【问题描述】:

我正在使用 Windows Community Toolkit for UWP 中的 DataGrid 控件,但我找不到动态隐藏或显示列的解决方案。

Runtime error: Failed to assign to property 'Microsoft.Toolkit.Uwp.Ui.Controls.DataGridColumn.Visibility'

<controls:DataGrid x:Name="TradeGrid">
  <controls:DataGridTextColumn
    x:Uid="DataColumnPositionContract"
    Width="SizeToCells"
    Binding="{Binding Path=TradePosition.Contract.Name}"
    Tag="Contract"
    Visibility="{Binding ElementName=TradeGrid, Path=DataContext.IsContractVisible, Converter={StaticResource BoolToVisConv}}" />
</controls:DataGrid>

视图模型结构如下:

PageViewModel(绑定到页面)

  • 项目列表(DataGrid 的项目源)
  • 列可见性属性

ItemViewModel(列的DataContext)

  • 项目属性

转换器是工具包提供的转换器。要绑定的布尔属性不是列 (ItemViewModel) 的 DataContext 的一部分。我需要访问父视图模型(PageViewModel)来获取属性。

谁能告诉我如何绑定到 DataGridColumn 的 Visibility 属性?

如果在 UWP 中无法以这种方式绑定,我愿意接受其他解决方案。

谢谢!

【问题讨论】:

    标签: uwp datagrid windows-community-toolkit


    【解决方案1】:

    首先,根据您提供的代码,我无法重现运行时错误

    其次,DataGridTextColumnVisibility 属性不是source code 的依赖属性,因此绑定将不起作用。

    因此,当您知道要隐藏或显示的目标列时,可以尝试将Visibility 属性的值直接设置为Visibility.CollapsedVisibility.Visible

    更新:

    如果你想直接设置Visibility属性,你需要知道目标列的索引(如“0”),并在代码隐藏的方法中编写代码,如Click按钮上的事件处理程序,如下所示:

    dataGrid1.Columns.ElementAt(0).Visibility = Visibility.Visible;
    

    您可以使用 {x:Bind} 扩展而不是 {Binding} 扩展来显示或隐藏 DataGrid 中的列,并且绑定源类需要实现System.ComponentModel.InotifyPropertyChanged,像这样

    <controls:DataGridTextColumn 
                ……    Visibility="{x:Bind SourceClass.Visible,Mode=OneWay}"  />
    

    您可以更改SourceClass.Visible 的值以在运行时显示或隐藏列。

    【讨论】:

    • 如何直接设置Visibility属性?在代码隐藏的方法中?有没有办法使用绑定在运行时按需显示/隐藏 DataGrid 中的列?
    • 我更新了之前的答案,你可以看看是否能满足你的要求。
    • 我选择了代码隐藏解决方案,因为我的视图模型需要一些重构才能使用{x:Bind}。它正在工作,所以我可以达到我的目标!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2015-08-18
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    相关资源
    最近更新 更多