WPF DataGrid多选行数据并绑定属性

  在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>