将命令传递给其他类

时间:2012-10-12 10:52:03

标签: c# wpf mvvm

我刚刚开始使用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中常用于在ViewModel之间发送消息,这是更好的事情吗?我想我所做的事情就是我与FakeManager紧密相连,而且感觉有点笨拙。

由于

2 个答案:

答案 0 :(得分:1)

首先,我同意blindmeis在属性获取器中创建新命令违反了属性获取者的一般期望,包括:

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

但这是不重要的,所以我不会劳动它。

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

答案 1 :(得分:1)

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

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