我是WPF项目中的MVVM新手。至于我的理解,View是由xaml文件(window,grid,usercontrol)创建的对象。模型是我的数据。 View-Model是其他一些对象实例。
我已经定义了所有VM类,但我的问题是实例化VM实例的最佳位置在哪里?更具体地说,我应该在哪里声明VM成员变量并调用new()函数?
目前我定义了VM的静态成员变量,并在我的usercontrol中声明它。应该通过多个视图访问VM,这就是我将其声明为静态的原因。
我认为,从面向对象的设计来看,这有点难看,因为我使用的是静态或全局变量。
那么声明VM实例的常见地方是什么?
答案 0 :(得分:1)
解决此问题的一个好方法是在“Viewmodel-Locator”类中创建和共享视图模型,如代码templates of the MVVM-Light Framework中所示。 MVVM Light附带一个小型IOC容器,用于管理视图模型和服务的实例化。这是一些示例代码: 首先以静态方式注册您的服务和视图模型:
public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
//Resgister your Services
SimpleIoc.Default.Register<IDataService, SomeDataService>();
// Register your Viewmodels
SimpleIoc.Default.Register<SomeViewModel>();
}
为每个已注册的Viewmodel创建一个属性,以便从viewmodelLocator类外部访问它们:
public SomeViewModel SomeVM
{
get
{
return ServiceLocator.Current.GetInstance<SomeViewModel>();
}
}
接下来,在App.xaml中创建一个globel资源,以访问XAML中的ViewmodelLocator类。
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</Application.Resources>
将datacontext绑定在您的视图中,如下所示:
DataContext="{Binding SomeVM, Source={StaticResource Locator}}"
最后,在您的viewmodel类中,您可以访问您的服务并执行您需要执行的操作:
class SomeViewModel
{
private IDataService mDataService;
public SomeViewModel(IDataService _dataService)
{
mDataService = _dataService;
// Do the fancy stuff...
}
}
希望这有用!
答案 1 :(得分:0)
我个人使用'KEEP IT SIMPLE STUPID'方法。我有一个名为NameSpace Models的Models文件夹和一个ViewModel文件夹NameSpace ViewModels。
Models文件夹包含复制我从WCF服务获取的数据的直接数据。这也适用于EDM。
ViewModels文件夹保存了某个窗口或页面所需的实际数据,即我可能需要一个年份列表和一个特定客户端,因此我的ViewModel将调用“Models”文件夹中的YearList模型和来自'Models'文件夹。
即
视图模型
class ClientDetailsViewModel
{
public ClientModel ClientModel { get; set; }
public YearListModel YearList { get; set; }
public ClientDetailsViewModel(ClientModel _ClientModel)
{
ClientModel = _ClientModel;
YearGroupList = new YearGroupListModel();
}
}
然后我将ViewModel绑定到Window或Form并使用例如:
绑定数据{Binding ClientModel.ID}
{Binding YearGroupList.Years.ID}