根据MSDN里Freezable的相关文档,在Remarks下有这样的一句话
-
Detailed change notification: Unlike other DependencyObject objects, a Freezable object provides change notifications when sub-property values change.
大意就是和其他的DependencyObject相比,在子属性值更改时, Freezable 对象提供更改通知。个人认为应该是由于Freezable有这个特点,所以才能被用在这里。
代码如下
BindingProxy类
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); }
}
// 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 UIPropertyMetadata(null));
}
值转换器,将int值转换为界面显示属性值
//可从数据库取值,1为显示 0为隐藏
[ValueConversion(typeof(int), typeof(Visibility))]
public class ColumnVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Visibility visibility = Visibility.Visible;
int surplus = (int)value;
switch(surplus)
{
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;
}
}
XAML引用BindingProxy
<UserControl.Resources>
<local:ColumnVisibilityConverter x:Key="ColumnVisibilityConverter"/>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</UserControl.Resources>
Visibility绑定
<DataGridTextColumn Visibility="{Binding Data.IsShow, Converter={StaticResource ColumnVisibilityConverter},Source={StaticResource proxy}}"/>
ViewModel
private int _isShow;
public int IsShow
{
get
{
return _isShow;
}
set
{
SetProperty(ref _isShow, value);
}
}
//设置IsShow的值,1为显示,0位隐藏,可从数据库取值
IsShow = 1;
此方法还可同样绑定列名
<DataGridTextColumn Visibility="{Binding Data.IsShow, Converter={StaticResource ColumnVisibilityConverter},Source={StaticResource proxy}}"
Header="{Binding Data.ColumnName,Source={StaticResource proxy}}/>
此方法还可同样绑定显示顺序,这里要注意,DisplayIndex范围为0~总列数-1(0<=DisplayIndex<总列数),因此顺序赋值时,需要重新排序。
<DataGridTextColumn Visibility="{Binding Data.IsShow, Converter={StaticResource ColumnVisibilityConverter},Source={StaticResource proxy}}"
Header="{Binding Data.ColumnName,Source={StaticResource proxy}}
DisplayIndex="{Binding Data.ColumnSort,Source={StaticResource proxy}}"/>
另绑定DisplayIndex时xaml会提示错误,如下,可以不管它,编译不会受影响,效果也不会受影响