WPF中DataGridColumn的绑定可见性

如何通过绑定隐藏WPF DataGrid的列?

这就是我所做的:

 <DataGridTextColumn Header="Column header" Binding="{Binding ColumnValue}" Width="100" ElementStyle="{StaticResource DataGridRightAlign}" Visibility="{Binding MyColumnVisibility}" /> 

这就是我所得到的(除了列仍然可见):

System.Windows.Data错误:2:找不到控制目标元素的FrameworkElement或FrameworkContentElement。 BindingExpression:path= MyColumnVisibility; 的DataItem = NULL; 目标元素是'DataGridTextColumn'(HashCode = 1460142); 目标属性是“可见性”(types“可见性”)

不知道什么pipe理手段。 总统先生在我窗前的某个地方有什么决定哪些是有效的,哪些不是? 或者我需要投票支持什么?

在networkingsearch解决scheme的过程中,我发现有十几个页面的标题很有希望,但内容完全不相关或不可重复。 所以这似乎是关于这个问题的第一个问题。 任何想法?

首先DataGridTextColumn或任何其他支持的dataGrid列不在DataGrid Visual树中 。 因此,默认情况下它不会inheritanceDataGrid DataContext 。 但是,它只适用于Binding DP,而不适用于DataGridColumn上的其他DP。

因为它们不在同一个VisualTree中,所以任何使用RelativeSource获取DataContext的方法都不能正常工作,因为DataGrid将无法遍历到DataGrid。

有两种方法可以做到这一点:


首先使用Freezable类 – Freezable对象可以inheritanceDataContext,即使它们不在视觉或逻辑树中。 所以,我们可以利用这个优势来使用。

首先创build一个inheritance自FreezableData DP的类,我们可以使用它在XAML中进行绑定:

 public class BindingProxy : Freezable { #region Overrides of Freezable protected override Freezable CreateInstanceCore() { return new BindingProxy(); } #endregion public object Data { get { return (object)GetValue(DataProperty); } set { SetValue(DataProperty, value); } } public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy)); } 

现在,将其实例添加到DataGrid资源中,以便它可以inheritanceDataGrid的DataContext,然后可以绑定到其Data DP:

  <DataGrid> <DataGrid.Resources> <local:BindingProxy x:Key="proxy" Data="{Binding}"/> </DataGrid.Resources> <DataGrid.Columns> <DataGridTextColumn Visibility="{Binding Data.MyColumnVisibility, Source={StaticResource proxy}}"/> </DataGrid.Columns> </DataGrid> 

其次 ,您可以使用ElementNamex:Reference XAML中的任何UI元素。 但是ElementName只能在相同的可视化树中工作,而x:Reference不具有这样的约束。

所以,我们也可以利用这个优势。 将“可见性”设置为“折叠”的XAML中创build虚拟FrameworkElement 。 FrameworkElement将从它的父容器(可以是Window或UserControl)inheritanceDataContext。

并可以在DataGrid中使用它:

  <FrameworkElement x:Name="dummyElement" Visibility="Collapsed"/> <DataGrid> <DataGrid.Columns> <DataGridTextColumn Header="Test" Binding="{Binding Name}" Visibility="{Binding DataContext.IsEnable, Source={x:Reference dummyElement}}"/> </DataGrid.Columns> </DataGrid> 
  <Window.Resources> <ResourceDictionary> <FrameworkElement x:Key="ProxyElement" DataContext="{Binding}" /> </ResourceDictionary> </Window.Resources> <ContentControl Content="{StaticResource ProxyElement}" Visibility="Collapsed" /> <mch:MCHDataGrid Height="350" AutoGenerateColumns="False" FlowDirection="LeftToRight" ItemsSource="{Binding PayStructures}" SelectedItem="{Binding SelectedItem}"> <DataGrid.Columns> <DataGridTemplateColumn Width="70" Header="name" IsReadOnly="True" Visibility="{Binding DataContext.IsShowName, Source={StaticResource ProxyElement}}"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding FieldName}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </mch:MCHDataGrid> 

在视图模型

  private Visibility _isShowName; public Visibility IsShowName { get { return _isShowName; } set { _isShowName = value; OnPropertyChanged(); } }