Car*_*ven 36 c# design-patterns mvvm
在MVVM实现中,每个只ViewModel耦合一个Model吗?
我试图在项目中实现MVVM模式,但我发现有时View可能需要来自多个的信息Models.
例如,对于一个UserProfileView,其UserProfileViewModel可能需要从信息UserAccountModel,UserProfileSettingsModel,UserPostsDataModel等.
但是,在我读到的关于MVVM的大多数文章中,ViewModel仅通过依赖注入包含一个模型.因此构造函数只接受一个Model.
ViewModel当必须从多个信息中获取信息时,它将如何工作Models?或者这种情况会发生在MVVM中吗?
PS:我没有使用Prism或Unity Framework.我正在尝试将类似的模式实现到我正在使用的不使用Prism或Unity的项目中.这就是为什么我需要准确理解其中一些是如何工作的.
Ale*_*x J 40
在我对MVVM模式的理解中,唯一的实际要求是View从ViewModel的属性获取其所有数据(可能通过绑定机制).ViewModel是您专门为该视图制作的类,并承担根据需要填充自身的责任.您可以将其视为ActiveRecord的视图.
因此,您在ViewModel中执行的操作与获取其属性应显示的数据无关.您可以通过查询某些服务,读取一个或多个业务实体模型,在现场生成或上述所有内容来获取它.将所有这些东西组合起来制作功能性视图是完全正常的.
与任何表示模式一样,关键在于将显示屏幕上某些数据的过程与获取该数据的过程分开.这样,您可以单独测试流程的每个部分.
编辑:这是一个小但有希望完整的依赖关系流的例子.
// Model/service layer
public class MyModelA
{
public string GetSomeData()
{
return "Some Data";
}
}
public class MyModelB
{
public string GetOtherData()
{
return "Other Data";
}
}
// Presentation layer
public class MyViewModel
{
readonly MyModelA modelA;
readonly MyModelB modelB;
public MyViewModel(MyModelA modelA, MyModelB modelB)
{
this.modelA = modelA;
this.modelB = modelB;
}
public string TextBox1Value { get; set; }
public string TextBox2Value { get; set; }
public void Load()
{
// These need not necessarily be populated this way.
// You could load an entity and have your properties read data directly from it.
this.TextBox1Value = modelA.GetSomeData();
this.TextBox2Value = modelB.GetOtherData();
// raise INotifyPropertyChanged events here
}
}
public class MyView
{
readonly MyViewModel vm;
public MyView(MyViewModel vm)
{
this.vm = vm;
// bind to vm here
}
}
// Application layer
public class Program
{
public void Run()
{
var mA = new MyModelA();
var mB = new MyModelB();
var vm = new MyViewModel(mA, mB);
var view = new MyView(vm);
vm.Load();
// show view here
}
}
Run Code Online (Sandbox Code Playgroud)