私はC#でMVVMアプリケーションに取り組んできましたが、ViewダイジェストのViewModelsのコレクションを操作するときに、一貫していくつかの問題が発生しました。具体的には、それらはすべて、モデルがViewModelのプライベートメンバーであるという問題に関連する傾向があります。
この例は、(ビューからの要求に応じて)新しいViewModelを作成することです。いくつかの前文(私を助けるためにこれらを必要としないかもしれませんが)のために、ここにサンプルのModelクラスとViewModelクラスがあります:
Private Class Model()
{
public string Name { get; set; }
}
Public Class ViewModel()
{
Private Model _Model;
Public Void ViewModel(Model model)
{
_Model = model;
}
Public String Name
{
get
{
return _Model.Name;
}
set
{
_Model.Name = value;
}
}
}
モデル全体がViewModelのパブリックメンバーとして直接公開されることはありません。MainWindowViewModelは、Models(プライベート、ビューはこれらを表示できません)およびViewModels(ビューダイジェスト用にパブリック)のコレクションを処理します。
Public Class MainWindowViewModel
{
Private List<Model> _NamesModel;
Private ObservableCollection<ViewModel> _NamesViewModel;
Public Void MainWindowViewModel()
{
//Lets pretend we have a service that returns a list of models
_NamesModel = Service.Request();
foreach(Model model in _NamesModel)
{
ViewModel viewmodel = new ViewModel(model);
_NamesViewModel.Add(viewmodel);
}
}
Public ObservableCollection<ViewModel> NamesViewModel
{
get
{
return _NamesViewModel;
}
}
}
これが前文ですが、問題があります。新しいViewModelを追加するにはどうすればよいですか?ビュー内のメソッドは新しいViewModelを作成し、それを設定しますか?純粋主義者である私は、ビューがモデルを作成または設定することをまったく許可されるべきではないと想定しています。私のViewModelには、何も受け入れない(つまり、基になるモデルがない)コンストラクターを含める必要がありますか?代わりに、入力するブランクを作成しますか?
これらの種類の問題は、「純粋な」MVVMアプローチを考え出し続けます。モデル(削除の準備ができているなど)を内部モデルと比較するパブリックメソッド(bool compare(Model model))をViewModelに作成する必要がありました。モデルが公開されている(純度が高い)場合は、モデルに接続されているViewModelを見つけるなどの作業がはるかに簡単になります。