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>

浙公網安備 33010602011771號