在UWP DataGrid中隐藏列

问题描述

我正在使用UWP的Windows社区工具包中的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中无法通过这种方式绑定,我愿意接受其他解决方案。

谢谢!

解决方法

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

第二,Visibility的{​​{1}}属性不是source code的依赖属性,因此绑定将不起作用。

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

更新

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

Visibility

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

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

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