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

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

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

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

Q&A

解決済

1回答

4763閲覧

Messenger.RaiseでViewのメソッドを実行したい

tarofess

総合スコア127

WPF

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

0グッド

0クリップ

投稿2017/07/03 03:14

ViewModelからViewのSaveメソッドを実行したい場合、Messenger.Raiseを使えばいいとわかったのですが、以下のコードでは通知が飛ばせません。
どこを修正、または追加すれば通知が飛ばせるようになるでしょうか?
どなたか分かる方がいれば教えていただきたいです。宜しくお願いします。

ViewModel

C#

1 #region SaveCommand 2 private ViewModelCommand _SaveCommand; 3 4 public ViewModelCommand SaveCommand 5 { 6 get 7 { 8 if (_SaveCommand == null) 9 { 10 _SaveCommand = new ViewModelCommand(Save); 11 } 12 return _SaveCommand; 13 } 14 } 15 16 public void Save() 17 { 18 Messenger.Raise(new TransitionMessage(new SignDialogViewModel(), "SaveMessageKey")); 19 } 20 #endregion

View

C#

1 private void Save() 2 { 3 // 保存処理 4 5 this.Close(); 6 }

XAML

1 <i:Interaction.Triggers> 2 3 <!--Viewに特別な要件が存在しない限りは、トリガーやアクションの自作にこだわらず積極的にコードビハインドを使いましょう --> 4 <!--Viewのコードビハインドは、基本的にView内で完結するロジックとViewModelからのイベントの受信(専用リスナを使用する)に限るとトラブルが少なくなります --> 5 <!--Livet1.1からはコードビハインドでViewModelのイベントを受信するためのWeakEventLisnterサポートが追加されています --> 6 7 <!--WindowのContentRenderedイベントのタイミングでViewModelのInitializeメソッドが呼ばれます--> 8 <i:EventTrigger EventName="ContentRendered"> 9 <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="Initialize"/> 10 </i:EventTrigger> 11 12 <!--Windowが閉じたタイミングでViewModelのDisposeメソッドが呼ばれます--> 13 <i:EventTrigger EventName="Closed"> 14 <l:DataContextDisposeAction/> 15 </i:EventTrigger> 16 17 <!--WindowのCloseキャンセル処理に対応する場合は、WindowCloseCancelBehaviorの使用を検討してください--> 18 19 <l:InteractionMessageTrigger MessageKey="SaveMessageKey" Messenger="{Binding Messenger}"> 20 <l:TransitionInteractionMessageAction/> 21 </l:InteractionMessageTrigger> 22 23 </i:Interaction.Triggers> 24 25 <Grid> 26 <InkCanvas Name="SignCanvas" Width="auto" Height="auto" /> 27 <StackPanel 28 Orientation="Horizontal" 29 HorizontalAlignment="Right"> 30 <Button VerticalAlignment="Top" Margin="10" Width="50" Height="30" Content="Save" Command="{Binding SaveCommand}" /> 31 </StackPanel>

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

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

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

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

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

guest

回答1

0

ベストアンサー

ViewModelからViewのSaveメソッドを実行したい

View に保存を実装しないでください。
せっかく VM に SaveCommand を書いているのですから、そこで Model に実装された保存メゾットを実行してください。

投稿2017/07/03 03:44

編集2017/07/03 03:45
hihijiji

総合スコア4150

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

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

tarofess

2017/07/05 00:58

ご回答ありがとうございます。MVVMがあまりよくわかっていないので、参考になります。Modelに保存処理を書くこととして、保存処理が終わった後にViewを閉じるにはどうすればいいのでしょうか?
hihijiji

2017/07/06 01:30

使っている MVVMインフラに、WindowCloseAction クラスは実装されていませんか? 無かったら、"MVVM WindowCloseAction" で検索すればサンプルが見つかるはずです。 書かれている XAML のメッセージトリガにその実行処理を書けばOK
tarofess

2017/07/06 02:22

MVVM WindowCloseActionで検索してその内容をXAMLに書けばwindowを閉じることができました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問