本文在MVVM模式先實現了基於HandyControl的DataGrid多選,同時展示了為DataGrid單元格顯示不同顏色的方法,開發環境為:WPF + Prism + HandyControl。
1、添加多選列
<DataGridTemplateColumn Width="Auto"> <DataGridTemplateColumn.HeaderStyle> <Style TargetType="DataGridColumnHeader" BasedOn="{StaticResource DataGridColumnHeaderStyle}"> <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <CheckBox Content="全選" IsChecked="{Binding DataContext.CheckAll, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/> </DataTemplate> </Setter.Value> </Setter> </Style> </DataGridTemplateColumn.HeaderStyle> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>
2、為Model添加IsSelected屬性
public class Student : BindableBase { public string Name { get; set; } public int Score { get; set; } public Brush ScoreBrush => Score >= 60 ? PassedBrush : NotPassedBrush; public bool IsSelected { get => _isSelected; set => SetProperty(ref _isSelected, value); } private bool _isSelected; private static readonly Brush PassedBrush = new SolidColorBrush(Colors.Green); private static readonly Brush NotPassedBrush = new SolidColorBrush(Colors.Red); }
3、為ViewModel添加全選響應代碼
public class StudentWindowViewModel : BindableBase { public ObservableCollection<Student> StudentList { get; } public bool CheckAll { get => _checkAll; set { SetProperty(ref _checkAll, value); foreach (var item in StudentList) { item.IsSelected = value; } } } private bool _checkAll; //全選 public StudentWindowViewModel() { StudentList = new ObservableCollection<Student>() { new Student() {Name = "Student1", Score = 80}, new Student() {Name = "Student2", Score = 60}, new Student() {Name = "Student3", Score = 57} }; } }
4、DataGrid完整代碼
<DataGrid ItemsSource="{Binding StudentList}" Background="Transparent" BorderThickness="1" hc:DataGridAttach.CanUnselectAllWithBlankArea="True" hc:DataGridAttach.ShowRowNumber="True" HeadersVisibility="All" RowHeaderWidth="40" AutoGenerateColumns="False" SelectionMode="Single" SelectionUnit="FullRow"> <DataGrid.Columns> <DataGridTemplateColumn Width="Auto"> <DataGridTemplateColumn.HeaderStyle> <Style TargetType="DataGridColumnHeader" BasedOn="{StaticResource DataGridColumnHeaderStyle}"> <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <CheckBox Content="全選" IsChecked="{Binding DataContext.CheckAll, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/> </DataTemplate> </Setter.Value> </Setter> </Style> </DataGridTemplateColumn.HeaderStyle> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn IsReadOnly="True" CanUserSort="False" Binding="{Binding Name}" Header="姓名"/> <!--DataGridCheckBoxColumn IsReadOnly="False" CanUserSort="False" Binding="{Binding IsSelected, Mode=TwoWay}" Header="選中"/--> <DataGridTemplateColumn IsReadOnly="True" CanUserSort="False" Header="分數"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Score}" Foreground="{Binding ScoreBrush}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>