处理依赖于多个视图模型的命令的正确方法

时间:2019-01-30 23:43:10

标签: wpf mvvm mvvm-light relaycommand routed-commands

我对WPF和MVVM相对较新,我试图了解当命令在多个视图模型中具有依赖性时如何正确使用命令。

几个例子:

  • 在我当前的应用程序中,我有一个RelayCommand,该命令会导致保存动作在几个不同的视图模型中发生(它们写入了两个不同的文件)。目前,我正在使用mvvmlight Messenger来处理此问题,以将消息发送至那些视图模型以使它们执行保存,我认为这是正确的处理方法,因为它避免了向/上提供某种委托或事件的需要。这些视图模型。
  • 我在一个视图模型中有一个RelayCommand,该模型具有一个CanExecute方法,该方法依赖于其他2个视图模型的状态。我目前已经通过mvvmlight Messenger来解决此问题,方法是在视图模型中进行更改,CanExecute方法取决于消息,表明它们的状态现在对该操作有效。这似乎很混乱,但是我唯一想到的替代方法是使用委托或事件来将视图模型有效地编织在一起,我相信我应该避免。

是否有一些普遍接受的方式来处理我所缺少的?

1 个答案:

答案 0 :(得分:1)

在一般的视图模型层应具有1:用图1的关系,不应该有很好的理由一个“保存”功能中的图模型,然后通过另一个视图模型称为存在

听起来您应该做的就是将该逻辑放入服务中,例如:

public interface ISerializationService
{
    void Save(SomeData data);
}

然后,您需要此服务的实现并完成实际工作:

public class SerializationService : ISerializationService
{
    void Save(SomeData data)
    {
        // actual save happens here
    }
}

然后,您的视图模型应包含指向这些服务实例的属性:

public class MyViewModel : ViewModelBase
{
    [Inject]
    public ISerializationService SerializationService { get; set; }

    // called when the user clicks a button or something
    private void ButtonClickCommand()
    {
        this.SerializationService.Save(this.SomeData);
    }
}

剩下的唯一的问题是“什么套SerializationService的价值?”,为此,你需要一个依赖注入框架。那里有很多东西,MVVMLight会自己安装,但是Ninject是事实上的标准。当正确实施的注入框架会为你创建的所有视图模型,然后将“注入”的依赖关系,即你的SerializationService属性,类型ISerializationService,将用实例来初始化您的{{1} }类(在这种情况下也将配置为单例)。

依赖注入需要花点时间才能使您动起来,但是一旦开始使用它,您将永远不会回头。它有利于完成分离的,而担忧缓解需要指针传递给所有的一切向上和向下的结构分层。