为了账号安全,请及时绑定邮箱和手机立即绑定

WPF中DataGridColumn的绑定可见性

/ 猿问

WPF中DataGridColumn的绑定可见性

绝地无双 2019-10-22 12:12:01

WPF中DataGridColumn的绑定可见性

如何在wpf中隐藏列?DataGrid通过捆绑?

我就是这样做的:

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

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

数据错误:2:无法为目标元素找到控制FrameworkElement或FrameworkContentElement的方法。BindingExpression:path=MyColumnViability;DataItem=NULL;目标元素为“DataGridTextColumn”(HashCode=1460142);目标属性为“可见性”(类型为“可见性”)

不知道统治意味着什么。总统先生,在我的窗口里,是否有什么能决定什么起作用,什么不起作用?还是我要投什么票?

在搜索网页寻找解决方案时,我发现了十几个页面,标题很有希望,但内容完全无关或不可复制。所以这似乎是关于这个问题的第一个问题。知道吗?



查看完整描述

3 回答

?
慕莱坞5435954

首先DataGridTextColumn或任何其他受支持的数据网格列都不位于DataGrid..因此,在默认情况下它不会继承DataContextDataGrid..但是,它适用于Binding仅适用于DataGridColumn上的其他DP。

因为它们不在同一个VisualTree中,所以任何尝试使用RelativeSource因为DataGrid无法遍历到DataGrid,所以不能工作。

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


第一使用Freezable班级-Freezable对象可以继承DataContext,即使它们不在可视或逻辑树中。所以,我们可以利用这一点。

首先创建继承自FreezableData可以在XAML中绑定的DP:

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资源中添加它的一个实例,以便它可以继承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>

第二,您可以使用以下方法引用XAML中的任何UI元素ElementNamex:Reference..但ElementName只在相同的视觉树中工作,而x:Reference没有这样的约束。

所以,我们也可以利用这个优势。创建假人FrameworkElement在XAML中,可见性设置为折叠。FrameworkElement将从它的父容器继承DataContext,该容器可以是窗口或UserControl。

并且可以在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>



查看完整回答
反对 回复 2019-10-23
?
明月笑刀无情
<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();
    }
}



查看完整回答
反对 回复 2019-10-23
?
繁星点点滴滴

如果要打印当前DataContext的类,请使用以下命令:<TextBlock Text="{Binding DataContext, Source={StaticResource ProxyElement}}"></TextBlock>

查看完整回答
反对 回复 2019-10-23

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信