wpf DataGrid控制列是否显示,DataGrid列不会触发Visibility的转换器
DataGridTextColumn(以及所有 DataGridColumn 派生类)不是 Visual 或 FrameworkElement,它只是 DataGrid 的列配置对象,不属于 WPF 的可视化树 / 逻辑树。这导致:
RelativeSource={RelativeSource AncestorType=DataGrid} 无法定位到 DataGrid(因为列不在可视化树中,没有 “祖先” 元素);
下面的代码,列上面绑定Visibility是不会生效的,也不会触发ZybValueToVisibilityConverter转换,必须使用桥接模式:
<DataGridTextColumn
MinWidth="85"
Header="调试"
Visibility="{Binding DataContext.ColumnShowControl, RelativeSource={RelativeSource AncestorType=DataGrid}, Converter={StaticResource ZybValueToVisibilityConverter}}" />
解决方案:使用 Freezable 作为绑定桥接
这是 WPF 中解决 “非可视化元素绑定到可视化树数据” 的经典方案,通过 Freezable 对象作为桥梁,让列能访问到 DataGrid 的 DataContext。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
namespace Module.PEIS.Helper
{
public sealed class BindingProxy : Freezable
{
public Object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
// Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(Object), typeof(BindingProxy), new PropertyMetadata(default(BindingProxy)));
protected override Freezable CreateInstanceCore() => new BindingProxy();
}
}
页面需要引用BindingProxy 类的命名空间
xmlns:bindingProxy="clr-namespace:Module.PEIS.Helper"
步骤 2:修改 XAML 代码(关键)
<!-- 1. 在DataGrid的Resources中定义绑定桥接对象,绑定到DataGrid的DataContext -->
<DataGrid>
<DataGrid.Resources>
<bindingProxy:BindingProxy
x:Key="ColumnBindingProxy"
Data="{Binding DataContext, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
</DataGrid.Resources>
<!-- 2. 修改DataGridTextColumn的Visibility绑定,通过桥接对象访问数据 -->
<DataGridTextColumn
MinWidth="85"
Header="调试"
Visibility="{Binding Data.ColumnShowControl,
Source={StaticResource ColumnBindingProxy},
Converter={StaticResource ZybValueToVisibilityConverter}}"/>
</DataGrid>
原文地址:https://blog.csdn.net/u011511086/article/details/156952920
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!
