【问题标题】:Is it good practice to make a Model static in WPF (MVVM)?在 WPF (MVVM) 中将模型设为静态是一种好习惯吗?
【发布时间】:2013-07-03 19:02:14
【问题描述】:

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

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 模式制作模型静态是一种好的做法吗?”另外,这个实现是否可以优化,如果可以,如何优化?

【问题讨论】:

    标签: c# wpf mvvm static


    【解决方案1】:

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

    替代方法可能是不声明 this 模型 static,而是声明一些 static 模型持有者,它会根据请求返回完全相同的实例,所以在不同的视图上,就像现在一样,你会查看相同的模型以不同的方式呈现。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-20
        • 1970-01-01
        • 1970-01-01
        • 2013-10-13
        • 2020-12-14
        • 2013-10-14
        • 1970-01-01
        • 2013-03-28
        相关资源
        最近更新 更多