我应该在哪里将VM数据/实例保存在MVVM设计中?

时间:2013-09-29 09:23:27

标签: wpf mvvm

我是WPF项目中的MVVM新手。至于我的理解,View是由xaml文件(window,grid,usercontrol)创建的对象。模型是我的数据。 View-Model是其他一些对象实例。

我已经定义了所有VM类,但我的问题是实例化VM实例的最佳位置在哪里?更具体地说,我应该在哪里声明VM成员变量并调用new()函数?

目前我定义了VM的静态成员变量,并在我的usercontrol中声明它。应该通过多个视图访问VM,这就是我将其声明为静态的原因。

我认为,从面向对象的设计来看,这有点难看,因为我使用的是静态或全局变量。

那么声明VM实例的常见地方是什么?

2 个答案:

答案 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}