wpf mvvm模式数据绑定控制datagrid列显示隐藏、列名、显示顺序

根据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会提示错误,如下,可以不管它,编译不会受影响,效果也不会受影响

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值