2012-03-01 39 views
3

MVVMを理解しているので、ModelXクラスのXViewModelは、このクラスを他のすべてのクラスからアクセスしないようにして、モデルに対するすべての変更をXViewModelが認識するようにします。しかし、私は解決できない問題があります。MVVMのパターンとViewModelからModelへのアクセス

私はいくつかのクラスを次のように想像しています: ProjectModel、UserModel、およびGroupModel。 ProjectModelにはUserModelのリストが含まれ、リストにはUserModelのリストであるGroupModelが含まれます。

これらすべてのクラスについては、ViewModels: ProjectViewModel、UserViewModel、GroupViewModelが存在します。 ProjectViewModelは、モデルのすべてのリストをObservableCollectionにラップします(変更が必要な場合)。そうでない場合はReadOnlyCollectionで行います。私の場合はObservableCollectionです。

ここで、プロジェクトにグループを追加したいとします。

public GroupModel(UserModel user1, UserModel user2){} 

をしかし残念ながら、GroupViewModelはUserViewModelのフィールド_userへのアクセス何を持っていない。だから私は今GroupViewModelのコンストラクタはGroupModelのコンストラクタを呼び出すことによって、そのフィールド_groupModelを作成する必要があります

のようなものを呼び出しますしたがって、独自のフィールド_groupModelを作成することはできません。

私はこの問題に一度は直面していましたが、Googleでこれ以上の問題は発生しませんでしたが、ここではこれに対する良い解決策を見つけることができません。私が考えた

Possibilieソリューション:

  1. ごとのViewModelクラスでそのためのプロパティを保持することで、モデルへのアクセスを与えます。しかしこれは、モデルを不正なアクセスから隠すという考え方と矛盾しています。
  2. UserViewModelで "public static GroupModel CreateGroup()"を実装します。これはモデルにアクセスできるためです。しかし、これは少し汚れて聞こえる。

この問題をどのように解決しましたか?私はMVVPパターンで何かを逃していますか?

答えて

1

どのようにこのようなものについて:

var user1 = new User("Chriss"); 
var user2 = new User("Jena"); 
var userModel1 = new UserViewModel(user1); 
var userModel2 = new UserViewModel(user2); 
var group = new Group(userModel1 , userModel2); 
var project = new ProjectViewModel(); 
project.Groups.Add(new GroupViewModel(group)); 

ですから、外部グループを作成し、GroupViewModelにそれを渡しています。 Modelの作成はViewModelの責任であってはなりません。

希望します。

編集:ユーザーインスタンスの作成が修正されました。

+0

この例ではUserViewModelsをGroupに渡していますが、これはモデルであると想定しています。これは私には見えません。 – cadrell0

+0

私はこれについて考えていましたが、私の場合はこれで問題は解決しますが、一般的ではありません。それは保証されていない、私は常にモデルにアクセスする必要があります。おそらく、モデルは外部ライブラリの一部であり、データバインディングを動作させるためには、モデルをVMにラップする必要があります。その場合、私のGroupModelはコンストラクタ(UserViewModel、UserViewModel)、(UserModel、UserModel) – 0xBADF00D

関連する問題