当前位置: 首页 > 知识库问答 >
问题:

WPF的DataGridColumn的绑定可见性

令狐昌胤
2023-03-14

如何通过绑定隐藏 WPF 数据网格中的列?

这就是我所做的:

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

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

System. Windows. Data错误:2:找不到目标元素的管理Frameworks Element或Frameworks ContentElement。绑定表达式:路径=My列可见性;数据项=空;目标元素是“DataG的文本列”(HashCode=1460142);目标属性是“可见性”(类型“可见性”)

如何修复绑定?

共有3个答案

董良策
2023-03-14

我喜欢的另一个简单的解决方案是在与DataGrid相同的级别添加一个虚拟的折叠FrameworkElement。然后,FrameworkElement可以用作绑定 标记扩展。

比如像这样:

<FrameworkElement x:Name="FrameWorkElementProxy" Visibility="Collapsed"/>
<DataGrid>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="post" 
            Visibility="{Binding DataContext.DataGridColumnVisibility, Source={x:Reference Name=FrameWorkElementProxy}}"/>
    </DataGrid.Columns>
</DataGrid>
伍嘉
2023-03-14
<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();
    }
}
尚嘉勋
2023-03-14

首先,DataG里德特列(或任何其他受支持的dataGrid列)不位于DataGrid的Visual树中。因此,默认情况下,它不会继承DataGridDataContext。但是,它仅适用于绑定DP,不适用于DataG里德列上的其他DP。

由于它们不位于同一个VisualTree中,因此任何使用RelativeSource获取DataContext的尝试都不会奏效,因为DataG的文本列无法遍历到数据网格

不过,还有另外两种方法可以实现这一点:

可冻结对象可以继承 DataContext,即使它们不在可视化或逻辑树中 - 我们可以利用这一点。

首先,创建一个继承自FreezableDataDP的类,我们可以使用它在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资源中添加一个它的实例,以便它可以继承DataGrid的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元素。然而,<code>ElementName</code>只在同一个可视树中工作,而x:Reference没有这样的约束。

因此,我们也可以利用这一优势。在XAML中创建一个虚拟的<code>FrameworkElement</code>,可见性设置为<code>折叠</code>。FrameworkElement将从其父容器(可以是Window或UserControl)继承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>
 类似资料:
  • 我在这里遇到了TreeView绑定和ContextMenu的问题:Selected TreeView项为空 现在我有这个问题:我有ContextMenu (图片显示了我的ContextMenu的样子,不要介意tabItem...)。 正如你所看到的,它只是ContetMenu,没有MenuItem!如果用户单击“关闭”,我想在ViewModel中执行一些操作(发出命令?)。我还想知道他点了哪个按钮

  • 这是我的上下文菜单的样式: 这是我的MenuItem的样式: 命令绑定工作正常,但图标可见性绑定显示以下错误: 系统.Windows。数据错误:4:无法找到引用“RelativeSource FindAncestor,AncestorType=”System.Windows.Controls的绑定源。上下文菜单',祖先级别=“1”。BindingExpression:路径=PlacementTar

  • GridViewColumnExt是从GridViewColumn继承并添加可见性属性的类。 您可能会看到,我的ListView的ItemsSource被设置为寄存器ObservableCollection。Register类有一个名为vis的bool类型的属性。对于TextBox来说,这一切都很好,但是从GridViewColumnExt don来看,我认为我无法到达集合并绑定到特定的对象。 我

  • 我找不到访问“PR1”的方法,因为它在DataTemplate中,因此不能直接从代码隐藏中访问。绑定不能通过吗?它之前的列(“P2”列)就在test列上,我放入该列只是为了确保该值确实在更新,并且正确显示,但是“ProgressColumn”总是只显示默认值。 在ListView.View>GridView>GridViewColumn>GridViewColumn.CellTemplate>Da

  • 最好的办法是什么?根据显示的数据,我希望绑定到MyText1或MyText2。我怎么做“开关”?