如何隐藏在WPF列DataGrid
通过绑定?
这是我做的:
<DataGridTextColumn Header="Column header"
Binding="{Binding ColumnValue}"
Width="100"
ElementStyle="{StaticResource DataGridRightAlign}"
Visibility="{Binding MyColumnVisibility}" />
这是我得到了什么(除了列仍然可见):
System.Windows.Data错误:2:找不到理事FrameworkElement的或FrameworkContentElement上的目标元素。 BindingExpression:路径= MyColumnVisibility; 的DataItem = NULL; 目标元素是 'DataGridTextColumn'(的HashCode = 1460142); 目标属性是“可见性”(输入“可见性”)
不知道是什么意思执政。 有一些总统先生某处在我的窗口,决定什么可行,什么不是? 或者,我会投票给什么?
而寻找解决方案的网站,我发现像十几页有前途的标题,但完全无关的或不可再现的内容。 因此,这似乎是这个问题的第一个问题。 任何的想法?
首先, DataGridTextColumn
或任何其它支持的DataGrid列不在于视觉树DataGrid
。 因此,在默认情况下它不会继承DataContext
的DataGrid
。 但是,它的工作原理进行Binding
,并且只能用于没有其他DP的上的DataGridColumn DP。
因为,他们并不在同一个的VisualTree撒谎,因此任何尝试使用获得的DataContext RelativeSource
将无法正常工作,以及因为数据网格将无法移速度达DataGrid中。
有两种方法来实现,虽然:
首先使用Freezable
类- Freezable
对象甚至可以继承DataContext的,当他们在视觉或逻辑树不是。 因此,我们可以利用这一点给我们的使用。
首先,创建类继承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的DataContext的,然后可以用它的数据绑定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>
其次 ,你可以使用指任何UI元素XAML ElementName
或x:Reference
。 但是ElementName
只能在相同的视觉树,而X:参考没有这样的限制。
因此,我们可以把这个也对我们有利。 创建虚拟FrameworkElement
在XAML浏览权限设定为塌陷。 FrameworkElement的将继承的DataContext从它可以是窗口或用户控件父容器。
并且可以使用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>
<!-- Necessary for binding to resolve: adds reference to ProxyElement to tree.-->
<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();
}
}