1. 程式人生 > >WPF DataGrid點選列頭選擇全列並具有背景色

WPF DataGrid點選列頭選擇全列並具有背景色

完成這個操作,主要是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