正确实现模式MVVM

时间:2015-03-04 10:07:40

标签: c# wpf model-view-controller mvvm

我正在尝试实现MVVM模式,但我遇到了一些麻烦。

整个应用程序可以看作是一个向导。您必须在对话框A中选择一个项目以查看对话框B,这取决于您的选择。 Dialog C独立于其他选项,但必须执行一些业务逻辑,这取决于之前的选择。

我尝试做的是实现一个BaseViewModel来保存对这些选择的引用。 BaseViewModel引用了真实模型,它从数据库中检索数据并将它们存储为属性。

第一个问题我看到BaseViewModel就像是模型的“Facade”,因为它提供了对视图的模型属性的访问。

第二个问题是我以某种方式对几乎每个视图使用相同的BaseViewModel(和相同的引用)。在我看来,这感觉不对。这就像我通过使用不必要的(?)ViewModel。

增加复杂性来使用通常的MVC模式

另一个问题是,Dialog B的ViewModel依赖于Dialog A的选择。我是否必须实现一个Property,它在访问模型时检索模型的数据元素?

你们对这个系统有什么意见吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

首先让我说没有正确的'从绝对意义上回答。这一切都取决于你如何解决问题,你的技能,以及你问的那些人的意见。

那说:

  • 我认为你的第一个问题根本不是。围绕模型的外观正是VM中的MVVMCMVC的意图。
  • 关于第二个问题:如果您有类似向导的结构,那么将对话框A,B和C视为一个大视图的不同部分是有意义的。在这种情况下,无论您将其称为ViewModel还是Controller还是其他任何内容(只要您不直接访问您的商家数据来自UI)。

永远记住,这些模式不是为了虔诚地遵循它们,而是为了合理地利用它们来应对现实世界的问题。首先对您的问题进行建模(即业务案例),然后设计UI,然后才决定数据结构和设计模式。

所以MVVM(或MVC或者你最后称之为的任何东西)的决定都是最后的......

答案 1 :(得分:0)

我想我会考虑取消你的BaseViewModel并将你的功能分离到每个功能的单个VM中(1 View:1 ViewModel)。然后,您可以根据需要使用MVVM Light Messenger之类的内容在每个VM之间传递必要的数据:Proper way of using MVVM Light Messenger

答案 2 :(得分:0)

派对可能有点晚了,但是......

您应该将业务逻辑与ViewModel分开。 ViewModels实际上应该只包含表示逻辑。

我添加IConfigurationService及其适当的ConfigurationService实施。将其注册为" singleton" (确切名称取决于您的IoC容器术语,即Unity IoC容器中的ContainerControlledLifetimeManager),并让ViewModel在其构造函数中接受IConfigurationService

public WizardPage1ViewModel : ViewModel 
{
    private IConfigurationService configService;

    public WizardPage1ViewModel(IConfigurationService configService) 
    {
        this.configService = configService;
    }

    public string InstallationPath 
    {
        get { return this.configService.InstallationPath; }
        set 
        {
            if(path!=value) 
            {
                this.configService.InstallationPath = value;

                OnPropertyChanged("InstallationPath");
            }
        }
    }
}

在最终的ViewModel中,您只需从该服务中读取它。无需消息传递。只有当视图不知道消息/事件的接收者时,才需要消息传递/事件聚合器。

ViewModels 真的只关心Presentation Logic(从UI获取输入,对按钮做出反应,在View中显示格式值,即i18n)