質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

6406閲覧

DataGrid 複数選択できるようにしたいです。

wadamaruz01

総合スコア22

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

0クリップ

投稿2021/05/13 12:50

DataGridで複数選択している場合の処理を書きたいのですが、現在SelectedIndexでリストの中のどれを選択しているか1つしかわかりません。複数選択情報をプロパティにバインドする方法はないでしょうか?
<DataGrid SelectedIndex="{Binding Index}">

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

複数選択情報をプロパティにバインドする方法はないでしょうか?

DataGridにはSelectedItemsがありますが、残念ながらバインドできません。
MultiSelector.SelectedItems プロパティ (System.Windows.Controls.Primitives) | Microsoft Docs

こちらはどうでしょうか。
WPFのDataGridで選択された複数のアイテムをバインドするためのビヘイビア - chorus log

DataGridRowIsSelectedに個々のアイテムの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
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

助かりました!ありがとうございました。

投稿2021/05/18 12:26

wadamaruz01

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問