我正在尝试实现MVVM模式,但我遇到了一些麻烦。
整个应用程序可以看作是一个向导。您必须在对话框A中选择一个项目以查看对话框B,这取决于您的选择。 Dialog C独立于其他选项,但必须执行一些业务逻辑,这取决于之前的选择。
我尝试做的是实现一个BaseViewModel来保存对这些选择的引用。 BaseViewModel引用了真实模型,它从数据库中检索数据并将它们存储为属性。
第一个问题我看到BaseViewModel就像是模型的“Facade”,因为它提供了对视图的模型属性的访问。
第二个问题是我以某种方式对几乎每个视图使用相同的BaseViewModel(和相同的引用)。在我看来,这感觉不对。这就像我通过使用不必要的(?)ViewModel。
增加复杂性来使用通常的MVC模式另一个问题是,Dialog B的ViewModel依赖于Dialog A的选择。我是否必须实现一个Property,它在访问模型时检索模型的数据元素?
你们对这个系统有什么意见吗?
提前致谢。
答案 0 :(得分:2)
首先让我说没有正确的'从绝对意义上回答。这一切都取决于你如何解决问题,你的技能,以及你问的那些人的意见。
那说:
VM
中的MVVM
或C
中MVC
的意图。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)