DataGridで複数選択している場合の処理を書きたいのですが、現在SelectedIndexでリストの中のどれを選択しているか1つしかわかりません。複数選択情報をプロパティにバインドする方法はないでしょうか?
<DataGrid SelectedIndex="{Binding Index}">
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
複数選択情報をプロパティにバインドする方法はないでしょうか?
DataGrid
にはSelectedItems
がありますが、残念ながらバインドできません。
MultiSelector.SelectedItems プロパティ (System.Windows.Controls.Primitives) | Microsoft Docs
こちらはどうでしょうか。
WPFのDataGridで選択された複数のアイテムをバインドするためのビヘイビア - chorus log
DataGridRow
のIsSelected
に個々のアイテムのboolをバインドするような方法も見ますが、仮想化が有効だとまともに動きませんので事実上使えません。
xml
1<Window 2 x:Class="Questions338172.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:Behaviors="http://schemas.microsoft.com/xaml/behaviors" 6 xmlns:local="clr-namespace:Questions338172" 7 Width="800" 8 Height="450"> 9 <Window.DataContext> 10 <local:ViewModel /> 11 </Window.DataContext> 12 <Grid> 13 <Grid.ColumnDefinitions> 14 <ColumnDefinition /> 15 <ColumnDefinition /> 16 </Grid.ColumnDefinitions> 17 <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Items}"> 18 <Behaviors:Interaction.Behaviors> 19 <local:BindSelectedItemsBehavior SelectedItems="{Binding SelectedItems}" /> 20 </Behaviors:Interaction.Behaviors> 21 <DataGrid.Columns> 22 <DataGridTextColumn 23 Width="*" 24 Binding="{Binding Text}" 25 Header="Text" /> 26 </DataGrid.Columns> 27 </DataGrid> 28 <GroupBox Grid.Column="1" Header="Selected Items"> 29 <DockPanel> 30 <TextBlock DockPanel.Dock="Top" Text="{Binding SelectedItems.Count, StringFormat=Count: {0}}" /> 31 <ListBox DisplayMemberPath="Text" ItemsSource="{Binding SelectedItems}" /> 32 </DockPanel> 33 </GroupBox> 34 </Grid> 35</Window>
cs
1using CommunityToolkit.Mvvm.ComponentModel; 2using Microsoft.Xaml.Behaviors; 3using System.Collections; 4using System.Collections.ObjectModel; 5using System.Linq; 6using System.Windows; 7using System.Windows.Controls; 8using System.Windows.Data; 9 10namespace Questions338172 11{ 12 // [WPFのDataGridで選択された複数のアイテムをバインドするためのビヘイビア - chorus log](http://chorusde.hatenablog.jp/entry/2013/02/28/064747) 13 class BindSelectedItemsBehavior : Behavior<DataGrid> 14 { 15 public static DependencyProperty SelectedItemsProperty 16 = DependencyProperty.Register(nameof(SelectedItems), typeof(IList), typeof(BindSelectedItemsBehavior), 17 new PropertyMetadata(null)); 18 public IList SelectedItems { get => (IList)GetValue(SelectedItemsProperty); set => SetValue(SelectedItemsProperty, value); } 19 20 protected override void OnAttached() => AssociatedObject.SelectionChanged += SelectionChanged; 21 protected override void OnDetaching() => AssociatedObject.SelectionChanged -= SelectionChanged; 22 23 private void SelectionChanged(object sender, SelectionChangedEventArgs e) 24 { 25 if (SelectedItems == null) return; 26 27 foreach (var addedItem in e.AddedItems) 28 { 29 if (addedItem == CollectionView.NewItemPlaceholder) continue; 30 SelectedItems.Add(addedItem); 31 } 32 33 foreach (var removedItem in e.RemovedItems) 34 SelectedItems.Remove(removedItem); 35 } 36 } 37 38 class Item 39 { 40 public string Text { get; set; } 41 } 42 43 class ViewModel 44 { 45 public ObservableCollection<Item> Items { get; } 46 public ObservableCollection<Item> SelectedItems { get; } 47 48 public ViewModel() 49 { 50 Items = new ObservableCollection<Item>(Enumerable.Range(0, 1_000).Select(x => new Item { Text = $"Item{x}" })); 51 SelectedItems = new ObservableCollection<Item>(); 52 } 53 } 54 55 public partial class MainWindow : Window 56 { 57 public MainWindow() => InitializeComponent(); 58 } 59}
こちらを使用しています。
NuGet Gallery | Microsoft.Xaml.Behaviors.Wpf 1.1.31
投稿2021/05/13 21:52
編集2023/07/27 13:47総合スコア9862
0
助かりました!ありがとうございました。
投稿2021/05/18 12:26
総合スコア22
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。