参考链接:www.cnblogs.com/Stay627/p/1…
在WPF中,DataGridTextColumn
不是可视树的一部分,因此它不会继承任何DataContext
。这就是为什么你发现Thickness2Visibility
值更新无效的原因。为了解决这个问题,你可以使用一个自定义的Freezable
对象来捕获DataContext
,并将其用于绑定。以下是具体的步骤和代码示例:
- 创建一个自定义的
Freezable
类:这个类将用于存储和传递DataContext
。
public class BindingProxy : Freezable
{
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy));
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
}
- 在XAML中定义这个
Freezable
对象作为资源,并将其Data
属性绑定到你的Thickness2Visibility
属性。
<Window.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding Thickness2Visibility}" />
</Window.Resources>
- 修改你的
DataGridTextColumn
的Visibility
属性绑定,使用这个Freezable
对象作为绑定源。
<DataGridTextColumn Header="Thickness2" Binding="{Binding Thickness2}" Width="Auto">
<DataGridTextColumn.Visibility>
<Binding Path="Data" Source="{StaticResource proxy}" Converter="{StaticResource ColumnVisibilityConverter}" />
</DataGridTextColumn.Visibility>
</DataGridTextColumn>
converter
定义如下:
//可从数据库取值,1为显示 0为隐藏
[ValueConversion(typeof(int), typeof(Visibility))]
public class ColumnVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (null == value) return Visibility.Collapsed;
Visibility visibility = Visibility.Visible;
int visValue = (int)value;
switch (visValue)
{
case 1:
visibility = Visibility.Visible;
break;
default:
visibility = Visibility.Hidden;
break;
}
return visibility;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
这样,你的DataGridTextColumn
的Visibility
属性就会根据Thickness2Visibility
的值动态更新了。这种方法利用了Freezable
对象可以跨线程共享并继承DataContext
的特性,解决了DataGridTextColumn
不在可视化树中的问题。