2012-10-12 152 views
0

我刚开始使用WPF,并尝试使用MVVM方法(下面的this伟大的文章)。将命令传递给其他类

我有一个中央管理器类,所有视图模型都需要与之交互。我实现了这个使用一个单独的,所以我有我的单例类:

public class FakeManager 
    { 

     private FakeManager() {} 

     static FakeManager instance; 
     public static FakeManager Instance 
     { 
      get { return instance ?? (instance = new FakeManager()); } 
     } 

     ... 
    } 

在我看来,型号我这个互动就像这样:

public ICommand TriggerChannelChange 
{ 
    get 
    { 
     return new RelayCommand(() => FakeManager.Instance.SetupChangeRequest(_hardwareItem),() => true); 
    } 
} 

我的问题是 - 有没有更好的办法?我知道在WPF中通常用于在ViewModels之间发送消息的事件中介模式,在这里会更好吗?我想我所做的事情是我与FakeManager紧密结合的事实,再加上它感觉有点笨拙。

感谢

+0

属性获取器中的“return new”听起来总是对我不利 – blindmeis

+0

Hi @blindmeis。你的意思是ICommand?这在我见过的MVVM实现中似乎是非常标准的。为了发送命令,我认为它很好。 –

+0

又增加了一条评论re:这回答如下 –

回答

1

首先,我blindmeis同意,在一个属性的getter创建一个新的命令违反了属性的getter的一般预期,其中包括:

  • ,他们都非常轻巧
  • 那他们返回相同的对象,除非它被替换(可能通过setter)

但是这是一个旁观点,所以我不会用它。

至于你的问题,我会建议寻找一个服务模式,从而为服务定义一个接口,然后你的视图模型依赖于该服务。他们获得服务的方式多种多样。您可能想从service locator pattern开始,或者查看dependency injectionMEF

+0

Re:属性获取者。我同意你所说的一切,我不希望道具吸气剂通常会给我一个新的物体。我认为这是这样的,以便XAML视图可以轻松地绑定到它,如CodeProject链接所示。但我会考虑解决这个问题。 –

+0

回复:建议。我很喜欢那样。我在一个MVC Web应用程序中大量使用DI,所以这将允许我删除耦合并在需要的地方注入服务。 –

1

您已经提到的发布/订阅者模式将是我的首选方法。棱镜与EventAggregator有很好的实现。

设置它的好处是,除了代码解耦之外,您可以以更简洁的方式推理问题域。你可以将你的视图模型作为独立的“孤岛”,通过系统发送定义好的(以域语言)消息。视角模型不必知道其他部分如何作用于他们。这些信息是系统的一个概念性组成部分,值得建模。它还简化了测试并简化了任务,以引入新功能并修复与这些消息交互的错误。

+0

干杯。我只在WPF/MVVM的小范围内看过ViewModels之间使用过的所有这些,所以我很谨慎地走下这条路。但它似乎确实适合需要。 –