C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

MVVMの具体例

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■93704 / inTopicNo.1)  MVVMの具体例
  
□投稿者/ たまじろ (3回)-(2020/01/16(Thu) 15:05:20)

分類:[.NET 全般] 

2020/01/16(Thu) 15:30:29 編集(投稿者)

MVVMについて勉強しています。

以下のプログラムを作成したいとします。
1.画面のボタンを押下
2.ファイル選択ダイアログを表示
3.ファイルが選択された場合はファイルを読み込む
4.読み込んだファイル内容を画面に反映
5.メッセージボックスで完了表示

役割は以下の認識ですが正しいでしょうか。
ViewModel
1.ボタン押下時のイベントを定義(ICommandの実装)
 Modelを呼び出す
4.ViewModelに定義されたプロパティにファイル読み込み結果を設定
(画面に反映)
5.メッセージボックスで完了表示

Model
2.ファイル選択ダイアログを表示 <− テストしづらいのでViewModelに持っていくべき?
3.ファイルが選択された場合はファイルを読み込む
 ファイル読み込み結果をViewModelにリターンする

また上記のテストコードを記述する場合
メッセージボックスとファイル選択ダイアログがネックになると思いますが
モックを作成するなどで対応するのが一般的なのでしょうか。

よろしくお願いします。


追記
私はこれまでフォームアプリケーションを作成していました。
その場合ViewModelに相当するようなものは作成せずViewのコードビハインドに
1 -> 2 -> Model呼び出し -> 4 -> 5
としていました。
MVVMで実装を考えているのですがViewModelとModelの境界線が難しいです。
余り気にせず作成すべきでしょうか・・・
引用返信 編集キー/
■93727 / inTopicNo.2)  Re[1]: MVVMの具体例
□投稿者/ ぶなっぷ (216回)-(2020/01/21(Tue) 10:59:26)
2020/01/21(Tue) 11:27:24 編集(投稿者)
なかなかRESがつかないですね。
私の持論でお話ししますね。

MVVMと言っても、現実には、そこまで厳格なものではないと思います。
確実なのは、
  <ComboBox ItemsSource="{Binding NameList}" ...
などとしたときに、NameListというプロパティがViewModelに存在する。
それぐらいじゃないでしょうか?

その結果として、GUIの設計とは無関係に内部処理の設計ができる。
NameListの実体が文字列リストだとして、
それを ComboBox に表示するか、ListBoxに表示するか、DataGridに表示するか、
なんてのはGUIの都合であって、内部処理とは無関係な話です。
それを分離したいというのがMVVMの基本理念だと思うからです。

なので、私的にはICommandは必須じゃないと思います。
メッセージはこれまで通り、Viewにハンドラを用意してもよくて、そこから
DataContext参照して、ViewModelのメンバを呼んでBindingデータを更新できれば
いいわけです。
(より、ViewとViewModelの完全分離を目指すならICommandかな、ぐらい)

重要なのは、
「ComboBoxの表示内容とNameListの内容が完全に動的リンクすること」
これだけです。
そうすれば、ViewとViewModelの分離は可能だと思うからです。

ViewModelとModelになると、もっと曖昧な気がします。
単純なアプリなら、ViewModel == Model でいいし(ViewModelのプロパティを
そのまま保存しちゃえばいい)、
電卓のようなアプリなら、何も保存するものがないので、Modelがなくても
良いのではないでしょうか。

引用返信 編集キー/
■93740 / inTopicNo.3)  Re[2]: MVVMの具体例
□投稿者/ びんくす (1回)-(2020/01/23(Thu) 20:38:00)
2020/01/23(Thu) 20:38:45 編集(投稿者)
2020/01/23(Thu) 20:38:37 編集(投稿者)

ファイル選択ダイアログはViewのたぐいになると思うので、
それをViewModelやModelから直接呼びだすのはMVVMパターン
の考え方からするとあまりよろしく無い気がします。
懸念されている通りテストもしづらくなりますし。

私が以前MVVMで作ったときはファイル選択ダイアログが必要
になったタイミングでViewModelからViewにイベントを上げて、
トリガーアクションを使ってイベント引数に選択結果を渡す、
というような形で実装しました。
あるいはViewModelにはファイル名だけをバインドするように
して、ダイアログの表示に関してはView側で完結させるとい
う方法もあるかと思います
(ファイル名設定後にICommandを呼び出す)。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ