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自Freezable
和Data
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>
其次 ,您可以使用ElementName
或x: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(); } }