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

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

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

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

MVVM

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

WPF

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

Q&A

解決済

1回答

3270閲覧

DataTemplate内のTextBlockにEventTriggerを設定したい

comet7360

総合スコア9

C#

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

MVVM

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

WPF

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

1グッド

0クリップ

投稿2020/08/01 00:45

編集2023/07/22 19:08

前提・実現したいこと

WPF+Prism+MVVMでTreeViewを表示するプログラムを作成しています。

TreeViewで表示した項目(TextBlock)に対して左クリックを押下した時のイベントを補足したいのですが、
EventTriggerを設定しても補足できません。

xaml

1<Window x:Class="T001.Views.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:prism="http://prismlibrary.com/" 5 prism:ViewModelLocator.AutoWireViewModel="True" 6 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 7 Title="T001App" Height="480" Width="640" 8 WindowStartupLocation="CenterScreen"> 9<Grid> 10<TreeView> 11 <TreeViewItem Header="TreeHeader" ItemsSource="{Binding DataList}"> 12 <TreeViewItem.ItemTemplate> 13 <DataTemplate> 14 <TextBlock Text="{Binding Name}"> 15 <i:Interaction.Triggers> 16 <i:EventTrigger EventName="PreviewMouseLeftButtonDown"> 17 <prism:InvokeCommandAction Command="{Binding PreMouseLBtnDownDSCmd}"/> 18 </i:EventTrigger> 19 </i:Interaction.Triggers> 20 </TextBlock> 21 </DataTemplate> 22 </TreeViewItem.ItemTemplate> 23 </TreeViewItem> 24</TreeView> 25</Grid> 26</Window>

C#

1namespace T001.ViewModels 2{ 3 public class MainWindowViewModel : BindableBase 4 { 5 private ObservableCollection<Data> _dataList = new ObservableCollection<Data>(); 6 public ObservableCollection<Data> DataList 7 { 8 get { return _dataList ; } 9 set { SetProperty(ref _dataList , value); } 10 } 11 12 public DelegateCommand<MouseButtonEventArgs> PreMouseLBtnDownDSCmd { get; private set; } 13 14 public MainWindowViewModel() 15 { 16 //データを作る 17 DataList = new ObservableCollection<Data>(); 18 for(int i = 0 ; i < 5; i ++){ 19 Data data = new Data(); 20 data.Name = i; 21 22 DataList.Add(data); 23 } 24 25 //コマンドにメソッドを登録 26 PreMouseLBtnDownDSCmd = new DelegateCommand<MouseButtonEventArgs>(PreMouseLBtnDownDS); 27 } 28 29 private void PreMouseLBtnDownDS(MouseButtonEventArgs e) 30 { 31 //ここに入ってこない! 32 ; 33 } 34 } 35 36 public class Data 37 { 38 public string Name { get; set; } 39 } 40}

試したこと

  • コードビハインド

 以下のように、<TextBlock>に直接イベントを登録すると、イベントハンドラで補足できました。
ですが、MVVMで作成したいため、コードビハインドは出来るだけ使用したくありません。

xaml

1 <TextBlock Text="{Bindnig Name}" PreviewMouseLeftButtonDown="OnMouseEvent" />

C#

1namespace T001.Views 2{ 3 /// <summary> 4 /// Interaction logic for MainWindow.xaml 5 /// </summary> 6 public partial class MainWindow : Window 7 { 8 public MainWindow() 9 { 10 InitializeComponent(); 11 } 12 13 private void OnMouseEvent(object sender, MouseButtonEventArgs e) 14 { 15 //ここには入ってきます。 16 ; 17 } 18 } 19}
TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

出力ウィンドウに↓のようなエラーが大量に出ているはずです。

System.Windows.Data Error: 40 : BindingExpression path error: 'PreMouseLBtnDownDSCmd' property not found on 'object' ''Data' ...

{Binding Name}としているように、ここではclass Dataが入ってきています。

解消するには
class DataのほうにPreMouseLBtnDownDSCmdを作る(操作によってはこのほうがいい場合もあるでしょう)

xml

1<prism:InvokeCommandAction Command="{Binding Path=DataContext.PreMouseLBtnDownDSCmd, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeView}}}" />

のようにRelativeSourceでたぐるか(美しくないがMainでやりたいような操作の場合こう書かざるを得ない)

になります。

投稿2020/08/01 01:33

編集2023/07/22 10:08
TN8001

総合スコア9246

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

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

TN8001

2020/08/01 01:50

メニューとかもいやですよね。 私はめんどくさいんでコードビハインドからvm呼んだりしちゃいます^^;
comet7360

2020/08/01 02:21

ご回答ありがとうございます。 指摘いただいた通り、上記のエラーが大量に出ていました。。 また、RelativeSourceで手繰るやり方を実装して解決いたしました! >>{Binding Name}としているように、ここではclass Dataが入ってきています。 まさにここが正しく理解できていませんでした。 ここ(DataTemplateの中?)ではVMのプロパティを直接参照することができないのですね。。 また実装に理解が追い付いていないのですが、慣れてきたらBindingProxyについても確認します。 ありがとうございました。
comet7360

2020/08/01 02:40

>>また実装に理解が追い付いていないのですが、慣れてきたらBindingProxyについても確認します。 BindingProxyでVMのコマンドプロパティをバインドできました、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問