在viewmodels之间传递/传递值的正确方法?

时间:2014-02-25 10:40:28

标签: c# wpf mvvm

我知道有很多关于这个主题的问题,我知道如何去做,但我需要一些关于我的架构设计的帮助。我正在使用Simple MVVM Toolkit。

建筑

  • 我有一个ShellVM,它是我的应用程序的主要VM。它包含了我的主视图所绑定的导航和道具。

  • 然后我有一个ManageVM,可以管理客户端,存储,导入,导出等所有工作。它还处理我所有管理视图的导航。

  • 然后我有一个可以充实数据导入的ImportVM。

  • 我还有一个静态的PageValues字典,用于存储切换视图时应保留的页面和特定属性和值。它还存储在某些VM中使用的任何“全局”属性。

我正在使用Messaging在VM之间传递数据。 PageValues数据的验证和提示(使用对话框)在我的 ManageVM 中进行控制。我把它放在这里,因为我觉得我的ManageVM应该处理所有'管理',比如设置客户端和存储。设置实际值是通过向处理此问题的 ShellVM 发送消息来完成的。

ShellVM 处理PageValues的CRUD。换句话说,如果任何VM获取或设置全局/ shell范围的属性,它通过向ShellVM发送消息来实现。然后,ShellVM将消息/结果发送回任何请求它的VM。

问题

这感觉非常意大利面。我有一个ManageVM,它在PageValues上进行加载和验证,实际上是在ShellVM中进行CRUD。

我是在正确的轨道上还是有任何其他建议我可以尝试让这感觉更清洁?

感谢阅读。

修改

我想要实现的是拥有一个容器,该容器包含可以从多个VM访问的值(即客户端和存储)。奖励是在此容器中也包含每个页面/视图的值。然后在显示视图时,它将从容器中获取其值并填充视图。

2 个答案:

答案 0 :(得分:2)

你说

  

如果任何VM获取或设置全局/ shell范围的属性,则通过以下方式执行此操作   向ShellVM发送消息的方法

我建议使用基于接口的方法而不是为此目的传递消息。传递消息的ViewModels用于视图模型进行通信,而不是用于设置全局状态。如果存在应用程序的全局状态,则可以通过专用服务IMO更好地处理它。

public interface IApplicationService
{
    //your applcation methods here
}

public class ApplicationService:IApplicationService
{
}

public class ManageVM
{
    public  ManageVM(IApplicationService){}
}

public class ShellVM
{
    public ShellVM(IApplicationService){}
}

public class SomeOtherVM
{
    public SomeOtherVM(IApplicationService){}
}

答案 1 :(得分:0)

是的,听起来确实比较混乱。您需要尝试将功能区域隔离到自己的VM中,这样它们就不会相互依赖。

我用来做这个的一个技巧是尝试想象我突然需要将一大堆功能(比如你的一个浏览量)复制到另一个应用程序中。这有多容易?是否只是复制一个VM并注入一些依赖项?或者VM是否不可能与应用程序的其余部分耦合?

在不确切了解您的应用正在做什么的情况下提供建议有点困难,但实际上您希望每个PageVM都负责它自己的验证和CRUD。或者,如果数据在许多页面之间共享,那么您需要传递某种存储库,而不是PageVM可以查询数据。如果验证逻辑特定于某些数据,则将其放在模型本身上,然后将该验证的表示留给VM。

对于全局设置,我倾向于传递设置对象而不是使用消息传递。

阅读inversion of controldependency injection。这些可以帮助您保持对象松散耦合,因为您可以通过查看构造函数来准确地查看对象所依赖的其他内容。如果您传入一半的应用程序,那么它可以作为警告警报来尝试减少耦合。