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

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

新規登録して質問してみよう
ただいま回答率
85.50%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

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

Q&A

解決済

1回答

2492閲覧

WPF+GalaSoft.MvvmLightでDatagrid上のセルにbuttonを配置してイベント関数をバインドして、該当行の情報を取得したい。

kinkin334

総合スコア62

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

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

0グッド

0クリップ

投稿2017/07/13 07:44

編集2017/07/13 11:55

###前提・実現したいこと
C#にてWPF+GalaSoft.MvvmLightでアプリを開発しています。
DataGrid上のセルにButtonを配置してクリックイベントでクリックされた行の情報を取得したいと考えています。
現在GalaSoft.MvvmLightライブラリのメソッドEventToCommandでメソッドをバインドしていますが、実現できていません。
EventToCommandによる実装方法、および他の実装方法による実現も含めて検討しています。

###発生している問題・エラーメッセージ
GalaSoft.MvvmLightライブラリのメソッドEventToCommandで、DataGrid上のセルに配置したButtonのクリックイベントをViewModel上のメソッドにバインドしていますが、バインド先のメソッドが実行されません。
PageのLoadイベントにバインドされているメソッドは実行されているのでコードミスによる実行は考え難いと思います。

###該当のソースコード
Xamlソース

(略)
↓ ViewModel上のイベントバインドしたメソッドが実行される
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<cmd:EventToCommand Command="{Binding PageMemberListLoadedCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
↑ ViewModel上のイベントバインドしたメソッドが実行される
(略)
<DataGridTemplateColumn x:Name="ColName" Width="150">
<DataGridTemplateColumn.Header>
<Button x:Name="ColNameTitleButton" Content="名前" Style="{StaticResource TitleButton}" Width="150">
↓ ViewModel上のイベントバインドしたメソッドが実行されない
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cmd:EventToCommand Command="{Binding ButtonClickCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
↑ ViewModel上のイベントバインドしたメソッドが実行されない
</Button>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button x:Name="btnName" HorizontalContentAlignment="Left" Style="{StaticResource CellButton}" Width="150">
↓ ViewModel上のイベントバインドしたメソッドが実行されない
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cmd:EventToCommand Command="{Binding ButtonClickCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
↑ ViewModel上のイベントバインドしたメソッドが実行されない
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

ViewModelソース

↓ ViewModel上の実行されるメソッド
private ICommand _PageMemberListLoadedCommand;
public ICommand PageMemberListLoadedCommand
{
get
{
return _PageMemberListLoadedCommand ?? (_PageMemberListLoadedCommand = new RelayCommand<RoutedEventArgs>(PageMemberListLoaded));
}
}

public void PageMemberListLoaded(RoutedEventArgs e) {

(略)
}
↑ ViewModel上の実行されるメソッド

↓ ViewModel上の実行されないメソッド
private ICommand _ButtonClickCommand;
public ICommand ButtonClickCommand
{
get
{
return _ButtonClickCommand ?? (_ButtonClickCommand = new RelayCommand<RoutedEventArgs>(ButtonClick));
}
}

public void ButtonClick(RoutedEventArgs e) { try { MessageBox.Show("ButtonClick"); } catch { } }

↑ ViewModel上の実行されないメソッド

###試したこと EventToCommandによる実装方法の調査を行いましたが、実現できる実装方法は見つかっていません。 実行されないイベントバインド箇所(DataGrid上に配置したButtonのクリックイベント)のはバインドしない形で記述すると<EventSetter>を使用して記述する必要があると思います。EventSetterを使用してイベントメソッドをフックする場合にEventToCommandでは実行されないとの情報を得て、他の実装方法についても調査検討したのですが、実装方法が見つかっていません。 ###補足情報(言語/FW/ツール等のバージョンなど) 言語 C# FW .NetFramework4.5.2 ライブラリ GalaSoft.MvvmLight 5.3 統合環境 VS2015

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

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

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

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

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

ebiryo

2017/07/13 08:57

ソースはマークダウンで記述してもらえないでしょうか? 
kinkin334

2017/07/16 20:23

ソースをマークダウンしました。
guest

回答1

0

ベストアンサー

そのXAMLの書き方だと DataGrid の ItemsSource にバインドしたコレクションの中の要素のプロパティにバインドしてます。
ViewModel をバインドしているのが Window の場合は、
"{Binding RelativeSource={RelativeSource AncestorType=Window, AncestorLevel=1}}"
のように指定する。
または、ItemsSource 用の ViewModel のクラスを作ります。
私は後者をよくやります。

投稿2017/07/13 08:31

編集2017/07/13 09:00
hihijiji

総合スコア4150

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

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

kinkin334

2017/07/13 12:35

アドバイスをありがとうございます。 wpfに精通していないのでイメージができないです。 具体例を挙げていたけると助かります。
kinkin334

2017/07/13 18:18 編集

アドバイスを参考に、イベントが発生しないbuttonのバインド箇所を以下のように変更して解決しました。 <Button x:Name="btnName" Command="{Binding DataContext.DataGridRowButtonClickCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Page}}}" CommandParameter="{Binding}" ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問