在WPF绑定能见度为的DataGridColumn在WPF绑定能见度为的DataGridColumn

2019-05-09 01:52发布

如何隐藏在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); 目标属性是“可见性”(输入“可见性”)

不知道是什么意思执政。 有一些总统先生某处在我的窗口,决定什么可行,什么不是? 或者,我会投票给什么?

而寻找解决方案的网站,我发现像十几页有前途的标题,但完全无关的或不可再现的内容。 因此,这似乎是这个问题的第一个问题。 任何的想法?

Answer 1:

首先, DataGridTextColumn或任何其它支持的DataGrid列不在于视觉树DataGrid 。 因此,在默认情况下它不会继承DataContextDataGrid 。 但是,它的工作原理进行Binding ,并且只能用于没有其他DP的上的DataGridColumn DP。

因为,他们并不在同一个的VisualTree撒谎,因此任何尝试使用获得的DataContext RelativeSource将无法正常工作,以及因为数据网格将无法移速度达DataGrid中。

有两种方法来实现,虽然:


首先使用Freezable类- Freezable对象甚至可以继承DataContext的,当他们在视觉或逻辑树不是。 因此,我们可以利用这一点给我们的使用。

首先,创建类继承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的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 ElementNamex: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>


Answer 2:

<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();
    }
}


文章来源: Binding Visibility for DataGridColumn in WPF