在WPF(MVVM)中创建Model静态是一种好习惯吗?

时间:2013-07-03 19:02:15

标签: c# wpf mvvm static

假设应用程序中的某些(而非所有)模型是静态的,并且被定义为BaseViewModel的成员,这样多个ViewModel(以及扩展名,Views)可以通过点击它们继承的数据来访问完全相同的数据。这是一个非常基本的布局,其中两个派生类可以访问同一个模型:

public class EmployeeModel
{
    public string Name;
    public int Id;
}

public class BaseViewModel
{
    private static EmployeeModel employeeModel = new Employee Model();
    public EmployeeModel EModel 
    { 
        get { return employeeModel; } 
        set { employeeModel = value; } 
    }

    public BaseViewModel() {}
}

public class EmployeeViewModel : BaseViewModel
{
    public EmployeeViewModel() 
    {
        base.Emodel.Name = "";
    }
}

public class HomeViewModel : BaseViewModel
{
    public EmployeeViewModel()
    {
        base.Emodel.Name = "";
    }
}

最后,它完成了工作,因为现在在多个视图中显示的相同数据没有问题。但是,这并不意味着没有一种我不知道的更合适的方式。由于我是WPF的新手,我不得不问,“是否正在为MVVM模式制作模型静态良好实践?”此外,是否可以优化此实施,如果是,如何优化?

2 个答案:

答案 0 :(得分:4)

这可不是一种不好的做法。因此,在您使用模型static的情况下,使您的程序按预期运行,这是一个很好的做法。

替代方法可能是不声明模型static,而是声明一些static模型持有者,它会根据请求返回完全相同的实例,因此在不同的视图中,如现在,您将看到以不同方式呈现的相同模型。

希望这会有所帮助。

答案 1 :(得分:1)

我会说这不是好习惯。你应该favour composition over inheritance。如果您希望所有人观看共享一个显示一些员工信息的公共UI(可能是当前登录的员工),那么您就是在谈论视图组合。

If you're using MVVM then you should use an MVVM framework。像Caliburn.Micro之类的东西使得视图合成非常容易。在这种情况下,您将拥有一个HeaderViewModel和一个对应的HeaderViewHeaderViewModel将雇员模型作为依赖项(例如注入到构造函数中)。

其他视图模型将通过其构造函数将HeaderViewModel(或工厂)作为依赖项。

如果您指的是以不同的方式显示相同的模型,那么只需将模型作为依赖关系通过构造函数传递给视图模型(假设需要依赖关系),并让视图模型直接公开模型(违反LoD)或委托对模型的调用(违反DRY原则)。