wpf mvvm模式資料繫結控制datagrid列顯示隱藏、列名、顯示順序
阿新 • • 發佈:2020-12-27
技術標籤: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會提示錯誤,如下,可以不管它,編譯不會受影響,效果也不會受影響