0

我是 WPF 项目中 MVVM 的新手。据我了解,视图是由 xaml 文件(窗口、网格、用户控件)创建的对象。模型是我的数据。View-Model 是其他一些对象实例。

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

目前我定义了一个虚拟机的静态成员变量并在我的用户控件中声明它。VM 应该由多个视图访问,这就是我将其声明为静态的原因。

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

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

4

2 回答 2

1

解决此问题的一个好方法是在“Viewmodel-Locator”类中创建和共享您的视图模型,就像在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 中创建一个全局资源,以访问 XAML 中的 ViewmodelLocator 类。

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

在您的视图中绑定您的数据上下文,如下所示:

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

最后,在您的视图模型类中,您可以访问您的服务并执行您需要执行的任何操作:

class SomeViewModel
{
    private IDataService mDataService;

    public SomeViewModel(IDataService _dataService)
    {
        mDataService = _dataService;

        // Do the fancy stuff...
    }
}

希望这有帮助!

于 2013-09-29T12:06:10.187 回答
0

我个人使用“保持简单愚蠢”的方法。我有一个名为 NameSpace Models 的 Models 文件夹和一个 ViewModel 文件夹 NameSpace ViewModels。

Models 文件夹包含直接数据,这些数据复制了我从 WCF 服务获得的数据。这也适用于 EDM。

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

IE

视图模型

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}
于 2013-09-29T16:41:35.417 回答