WPF DataGrid點選列頭選擇全列並具有背景色
阿新 • • 發佈:2019-08-22
完成這個操作,主要是XAML的程式碼。
主要思路是通過繫結多路資料,在多路轉換器中返回布林值,在通過資料觸發器來設定被選擇的全列的背景色。
XAML頁面主要程式碼
首先定義DataGridCell
<Style TargetType="DataGridCell" x:Key="dgc"> <Setter Property="Tag" > <Setter.Value> <MultiBinding Converter="{StaticResource T2}"> <Binding Path="DataContext.SelectColumn" RelativeSource="{RelativeSource Mode=FindAncestor,AncestorLevel=1,AncestorType=DataGrid}"/> <Binding Path="Column.Header" RelativeSource="{RelativeSource Mode=Self}" /> </MultiBinding> </Setter.Value> </Setter> <Style.Triggers> <DataTrigger Binding="{Binding Tag,RelativeSource={RelativeSource Mode=Self}}" Value="True"><!--此處的顏色也可以單獨列一個--> <Setter Property="Background" Value="Red"/> </DataTrigger> </Style.Triggers> </Style>
定義轉換器並使用
public class ToConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { var a = values[0].ToString(); var b = values[1].ToString(); return a == b ? true : false; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
xaml程式碼
<local:ToConverter x:Key="T2" /> <!--如果單獨繫結顏色可以這麼弄,然後通過靜態資源繫結到資料觸發器的setter即可--> <SolidColorBrush Color="Red" x:Key="color"/>
定義DataGrid並建立排序事件和使用CellStyle如下
<DataGrid Sorting="Dg_Sorting" ItemsSource="{Binding List}" CellStyle="{StaticResource dgc}" x:Name="dg" />
定義資料模型並賦值給DataGrid如下
public class T1 { public string Name { get; set; } public int ID { get; set; } } public class T2:INotifyPropertyChanged { public ObservableCollection<T1> List { get; set; } private string select; public string SelectColumn { get=>select; set { select = value;onchanged(new PropertyChangedEventArgs("SelectColumn")); } } protected void onchanged(PropertyChangedEventArgs args) => PropertyChanged?.Invoke(this, args); public event PropertyChangedEventHandler PropertyChanged; }
建立並賦值
ObservableCollection<T1> t = new ObservableCollection<T1>(); T2 datalist; public MainWindow() { InitializeComponent(); for (var i = 0; i < 20; i++) t.Add(new T1() { ID = i, Name = "i: " + i.ToString() }); datalist = new T2(); datalist.List = t; datalist.SelectColumn = string.Empty; dg.DataContext = datalist; }
最後編寫排序事件中的程式碼如下
private void Dg_Sorting(object sender, DataGridSortingEventArgs e) { datalist.SelectColumn = e.Column.Header.ToString(); e.Handled = true; }
執行截圖
如果是想將選定好的單元格新增到DataGrid的SelectCells中
則是需要新增玖彩技術團隊的這篇文章中的擴充套件類
然後關閉DataGrid的虛擬化
VirtualizingPanel.IsVirtualizing="False"
最後在排序事件中編寫程式碼如下
private void Dg_Sorting(object sender, DataGridSortingEventArgs e) { datalist.SelectColumn = e.Column.Header.ToString(); for (var i = 0; i < datalist.List.Count; i++) dg.SelectedCells.Add(new DataGridCellInfo(dg.GetCell(i, e.Column.DisplayIndex))); e.Handled = true; }
****************
迫不得已 我是非常不建議這麼操作的。
我建議使用資料繫結,操作資料來改變UI/資料的方式。
一是通過修改繫結資料這樣子就可以避免關閉DataGrid的虛擬化
二是操作相對簡單,僅僅操作資料即可
&n