2013-09-29 37 views
0

我是WPF项目中MVVM的新手。至于我的理解,视图是由xaml文件(窗口,网格,用户控件)创建的对象。模型是我的数据。 View-Model是其他一些对象实例。我应该在哪里将VM数据/实例保存在MVVM设计中?

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

当前我定义了一个虚拟机的静态成员变量,并在我的用户控件中声明它。虚拟机应该被几个视图访问,这就是为什么我声明它是静态的。

从面向对象的设计来看,我觉得这很丑,因为我使用了静态或全局变量。

那么宣布虚拟机实例的常见地点是什么?

回答

1

解决此问题的一个好方法是在代码templates of the MVVM-Light Framework中的“Viewmodel-Locator”类中创建和共享您的视图模型。 MVVM Light附带一个小型IOC容器,用于管理视图模型和服务的实例化。下面是一些示例代码: 先注册服务和的ViewModels以静态方式:

public class ViewModelLocator 
{ 
    static ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 
     //Resgister your Services 
     SimpleIoc.Default.Register<IDataService, SomeDataService>(); 

     // Register your Viewmodels 
     SimpleIoc.Default.Register<SomeViewModel>(); 
    } 

请为每个注册的ViewModels的属性从viewmodelLocator类的外部访问它们:

public SomeViewModel SomeVM 
{ 
    get 
    { 
     return ServiceLocator.Current.GetInstance<SomeViewModel>(); 
    } 
} 

接下来,在App.xaml中创建一个全局资源,以访问XAML中的ViewmodelLocator类。

<Application.Resources>   
     <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 
</Application.Resources> 

绑定在你看来这样您的DataContext:

DataContext="{Binding SomeVM, Source={StaticResource Locator}}" 

最后,在你的视图模型类,你可以访问你的服务,做任何你需要做的:

class SomeViewModel 
{ 
    private IDataService mDataService; 

    public SomeViewModel(IDataService _dataService) 
    { 
     mDataService = _dataService; 

     // Do the fancy stuff... 
    } 
} 

希望这是有帮助的!

+0

如果你使用MEF,您可以导出视图模型为单身人士达到同样的目的。与Unity同上。 – Gusdor

+0

我喜欢App.xaml中globel资源的想法 – Felix

0

我个人使用“保持简单愚蠢”的做法。我有一个叫做命名空间模型一个模型文件夹和一个视图模型文件夹命名空间的ViewModels。

Models文件夹认为,复制我从我的WCF获取数据直线数据这可能也适用于EDM

ViewModels文件夹包含我需要的特定窗口或页面的实际数据,例如我可能需要一个年份和特定客户端的列表,以便我的ViewModel将调用YearList模型“模型”文件夹和“模型”文件夹中的客户端模型。

视图模型

class ClientDetailsViewModel 
{ 
    public ClientModel ClientModel { get; set; } 
    public YearListModel YearList { get; set; } 

    public ClientDetailsViewModel(ClientModel _ClientModel) 
    { 
     ClientModel = _ClientModel; 
     YearGroupList = new YearGroupListModel(); 
    } 
} 

,那么我会绑定视图模型到窗口或表格,并使用例如绑定数据:

{Binding ClientModel.ID} 
{Binding YearGroupList.Years.ID} 
相关问题