1. 程式人生 > 其它 >wpf mvvm模式資料繫結控制datagrid列顯示隱藏、列名、顯示順序

wpf mvvm模式資料繫結控制datagrid列顯示隱藏、列名、顯示順序

技術標籤:c#

根據MSDN裡Freezable的相關文件,在Remarks下有這樣的一句話

  • Detailed change notification: Unlike otherDependencyObjectobjects, aFreezableobject 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會提示錯誤,如下,可以不管它,編譯不會受影響,效果也不會受影響