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

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

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

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

6102閲覧

[WPF] DataGrid の スクロールバー上のダブルクリックイベントの無効化はできますか?

shiroma77

総合スコア11

C#

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2017/08/10 04:58

Prism.WPFを使用してデスクトップアプリケーションを作成しています。

DataGridのダブルクリックイベントでPrismのInvokeCommandActionを利用していますが、スクロールバー上でダブルクリックを行ってもイベントが発生してしまいます。

スクロールバー上のイベントを無効化するにはどうすれば良いでしょうか。

以下コードです。
DataGridでPersonオブジェクトを表示し、ダブルクリックするとTextBlockに選択したPersonのNameが表示するようにしています。

xml

1<Window x:Class="DataGridDoubleClick.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:DataGridDoubleClick" 7 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 8 xmlns:prism="http://prismlibrary.com/" 9 prism:ViewModelLocator.AutoWireViewModel="True" 10 mc:Ignorable="d" 11 Title="MainWindow" Height="350" Width="525"> 12 <Grid> 13 <StackPanel> 14 <TextBlock Text="{Binding SelectedNameString}"/> 15 <DataGrid ItemsSource="{Binding Persons}" Height="300"> 16 <i:Interaction.Triggers> 17 <i:EventTrigger EventName="MouseDoubleClick"> 18 <prism:InvokeCommandAction Command="{Binding DoubleClickCommand}" 19 CommandParameter="{Binding SelectedItem, 20 RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/> 21 </i:EventTrigger> 22 </i:Interaction.Triggers> 23 </DataGrid> 24 </StackPanel> 25 </Grid> 26</Window>

c#

1using System.Linq; 2using System.Collections.ObjectModel; 3using Prism.Commands; 4using Prism.Mvvm; 5 6namespace DataGridDoubleClick 7{ 8 public class MainWindowViewModel : BindableBase 9 { 10 public ObservableCollection<Person> Persons { get; } = new ObservableCollection<Person>(); 11 12 #region SelectedNameStringプロパティ 13 private string _SelectedNameString; 14 public string SelectedNameString 15 { 16 get { return _SelectedNameString; } 17 set { SetProperty(ref _SelectedNameString, value); } 18 } 19 #endregion 20 21 public DelegateCommand<Person> DoubleClickCommand { get; } 22 23 public MainWindowViewModel() 24 { 25 Persons.AddRange(Enumerable.Range(1, 100).Select(x => new Person() 26 { 27 Id = x, 28 Name = "田中太郎" + x.ToString() 29 })); 30 31 DoubleClickCommand = new DelegateCommand<Person>(x => 32 { 33 SelectedNameString = x.Name; 34 }); 35 } 36 } 37 38 public class Person 39 { 40 public int Id { get; set; } 41 public string Name { get; set; } 42 } 43}

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

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

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

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

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

guest

回答1

0

ベストアンサー

提示されたコードですとスクロールバーだけでなく、カラムヘッダーや行の存在しない領域のダブルクリックでもイベントが発生すると思います。

コードビハインドで処理するなら簡単なのですが、コマンドにBindするとなるとひと手間かかると思います。

私でしたらDataGrid用に添付プロパティを設定します。

■DataGrid用添付プロパティ

C#

1public sealed class RowDoubleClickHandler : UIElement 2{ 3 public RowDoubleClickHandler(DataGrid dataGrid) 4 { 5 MouseButtonEventHandler handler = (sender, args) => 6 { 7 var row = sender as DataGridRow; 8 if (row == null || row.IsSelected == false) 9 return; 10 var cmd = GetDoubleClickCommand(dataGrid); 11 if(cmd != null ) 12 cmd.Execute(dataGrid.SelectedItem); 13 }; 14 15 dataGrid.LoadingRow += (s, e) => 16 { 17 e.Row.MouseDoubleClick += handler; 18 }; 19 20 dataGrid.UnloadingRow += (s, e) => 21 { 22 e.Row.MouseDoubleClick -= handler; 23 }; 24 } 25 26 public static DelegateCommand<object> GetDoubleClickCommand(DataGrid dataGrid) 27 { 28 return (DelegateCommand<object>)dataGrid.GetValue(DoubleClickCommandProperty); 29 } 30 31 public static void SetDoubleClickCommand(DataGrid dataGrid, DelegateCommand<object> value) 32 { 33 dataGrid.SetValue(DoubleClickCommandProperty, value); 34 } 35 36 public static readonly DependencyProperty DoubleClickCommandProperty = DependencyProperty.RegisterAttached( 37 "DoubleClickCommand", 38 typeof(DelegateCommand<object>), 39 typeof(RowDoubleClickHandler), 40 new PropertyMetadata((o, e) => 41 { 42 var dataGrid = o as DataGrid; 43 if (dataGrid != null) 44 new RowDoubleClickHandler(dataGrid); 45 })); 46}

■ViewModel側コマンド

C#

1DoubleClickCommand = new DelegateCommand<object>(x => 2{ 3 var person = x as Person; 4 if (person == null) 5 return; 6 7});

■Xaml

XML

1 <DataGrid ItemsSource="{Binding Persons}" Height="300" local:RowDoubleClickHandler.DoubleClickCommand="{Binding Path=DoubleClickCommand,Mode=OneWay}"> 2

投稿2017/08/10 07:49

ebiryo

総合スコア797

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問