在WPF的第三方控件UI库中,有些DataGrid实现了但是又有一些没实现多选行绑定数据。所有我现在通过附加属性来实现。
首先,实现DataGrid多选附加属性类
/// <summary> /// DataGrid多选附加属性 /// </summary> public class DataGridSelectedItemsBehavior : Behavior<DataGrid> { public IList SelectedItems { get => (IList)GetValue(SelectedItemsProperty); set => SetValue(SelectedItemsProperty, value); } public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register( nameof(SelectedItems), typeof(IList), typeof(DataGridSelectedItemsBehavior), new PropertyMetadata(null)); protected override void OnAttached() { base.OnAttached(); AssociatedObject.SelectionChanged += DataGrid_SelectionChanged; } protected override void OnDetaching() { base.OnDetaching(); AssociatedObject.SelectionChanged -= DataGrid_SelectionChanged; } private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { SelectedItems = AssociatedObject.SelectedItems; } }
ViewModel实现,这里我使用了CommunityToolkit.Mvvm来与界面交互,你可以自行选择。
public class MainViewModel : ObservableObject { [ObservableProperty] private ObservableCollection<ClassA> items = new(); [ObservableProperty] private IList selectedItems = newArrayList(); [RelayCommand] private void ExcuteConfirm() { foreach (var item in SelectedItems.Cast<ClassA>()) { } } }
其中DataGrid要把SelectionMode设置为Extended(表示可以多个选中),SelectionUnit设置为FullRow(表示完整行可以选中,单击单元格都会选中该行)。在XAML中使用之前你先看看你是否通过NuGet安装Microsoft.Xaml.Behaviors.Wpf。
<!-- 引用命名空间 Local 是你附加属性类所在的文件位置--> xmlns:i="http://schemas.microsoft.com/xaml/behaviors" xmlns:local="clr-namespace:YourNamespace.Behaviors" <!-- DataGrid定义 --> <DataGrid ItemsSource="{{Binding Items}}" SelectionMode="Extended" SelectionUnit="FullRow"> <i:Interaction.Behaviors> <local:DataGridSelectedItemsBehavior VisibleItems="{{Binding SelectedItems, Mode=OneWayToSource}}"/> </i:Interaction.Behaviors> </DataGrid>