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

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

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

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

MVVM

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

WPF

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

Q&A

解決済

1回答

4440閲覧

WPF PrismのCommandについて

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

MVVM

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

WPF

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

0グッド

0クリップ

投稿2019/02/28 03:42

編集2019/03/01 07:45

Prism×WPFでデスクトップアプリケーションをつくっています。
LoadイベントをバイディングすることでHelloを表示しようとしているのですがうまくいきません。

xamlでは下のようにバインディングしています。

デバッグをしてみるとロード時にif内がtrueでreturn new DelegateCommand(loaded);まではいくのですがloaded関数は呼び出されていない(loadにブレークポイント置いても止まらない)といった感じです。

<i:Interaction.Triggers> <i:EventTrigger EventName="Loaded"> <i:InvokeCommandAction Command="{Binding Loaded}" /> </i:EventTrigger> </i:Interaction.Triggers>
public DelegateCommand Loaded { get{ if (_Loaded == null) { return _Loaded= new DelegateCommand(load); } else { return _Loaded; } } } public void load() { MessageBox.Show("Hello"); }

Loadedは呼び出されるのでこれならうまくHelloが表示されます。
どうしてこんなことが起こってしまったのか...分かる方いましたらご教示ください。
宜しくお願い致します。

public DelegateCommand Loaded { get{          MessageBox.Show("Hello"); if (_Loaded == null) { return _Loaded = new DelegateCommand(load); } else { return _Loaded; } } } public void load() { }

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

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

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

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

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

guest

回答1

0

ベストアンサー

今の書き方だとLoadedを取得するたびに新しいインスタンスを作成するので、
前のLoadedのインスタンスは参照切れになります。
Viewの中でBindしたときに設定したLoadedのインスタンスがGCに回収されていれば呼ばれません。

似た書き方ですが、 訂正しました。

C#

1private DelegateCommand _LoadedCommand; 2public DelegateCommand LoadedCommand => 3 _LoadedCommand = _LoadedCommand ?? 4 new DelegateCommand(loaded);

ならOKのはずです。

投稿2019/02/28 08:00

編集2019/02/28 08:14
hihijiji

総合スコア4150

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

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

hihijiji

2019/02/28 08:48

「GCに回収されていれば呼ばれません」と書きましたが 回収されてなくても参照切れだと呼ばれない仕組みかもしれません。
退会済みユーザー

退会済みユーザー

2019/02/28 09:49

回答ありがとうございます! なるほど、MVVMについて調べた際null結合演算子を使っていた理由はそうゆうことだったのですね。 ただ今回の場合LoadはMainWindowのロード時のみ取得されるのでGCに回収されるといったことは当てはまるのでしょうか?試しに訂正した質問のように書きました(ビューモデル内の他のものも全て結合演算子を使いました)がだめでした... 他に考えられる原因など教えていただければ助かります。
hihijiji

2019/02/28 10:08

訂正後の書き方でも、_Loadedを初期化しなければ return new DelegateCommand(loaded); を通って新しいインスタンスを作っていますので同様です。 あと、DelegateCommandプロパティとメソッドは別名にしてください。
退会済みユーザー

退会済みユーザー

2019/03/01 07:59

ご指摘ありがとうございます! 色々試したところxamlのコードがEventName="Loaded"ではなくEventName="Closed"だとうまくいくことが分かりました。Loadedではうまくいかないので応急処置ではありますが空のloadメソッドを使う二つ目のやり方でやろうかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問