gpt4 book ai didi

wpf - WPF 中 DataGridColumn 的绑定(bind)可见性

转载 作者:行者123 更新时间:2023-12-03 05:34:47 25 4
gpt4 key购买 nike

如何通过绑定(bind)隐藏 WPF DataGrid 中的列?

这就是我所做的:

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

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

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=MyColumnVisibility; DataItem=null; target element is 'DataGridTextColumn' (HashCode=1460142); target property is 'Visibility' (type 'Visibility')

如何修复绑定(bind)?

最佳答案

首先,DataGridTextColumn(或任何其他受支持的 dataGrid 列)并不位于 DataGrid 的可视化树中。因此,默认情况下,它不会继承 DataGridDataContext。但是,它仅适用于 Binding DP,不适用于 DataGridColumn 上的其他 DP。

由于它们不在同一个 VisualTree 中,任何使用 RelativeSource 获取 DataContext 的尝试都不会起作用,因为 DataGridTextColumn > 无法遍历到 DataGrid

还有另外两种方法可以实现此目的:

<小时/>

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

首先,创建一个继承自 FreezableData DP 的类,我们可以使用它在 XAML 中进行绑定(bind):

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 绑定(bind):

    <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 元素。但是,ElementName 仅适用于同一可视化树,而 x:Reference 则没有此类约束。

因此,我们也可以利用这一点来发挥我们的优势。在 XAML 中创建一个虚拟 FrameworkElement,并将可见性设置为 collapsed。 FrameworkElement 将从其父容器继承 DataContext,该容器可以是 Window 或 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>

关于wpf - WPF 中 DataGridColumn 的绑定(bind)可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22073740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com