我刚刚开始使用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紧密相连,而且感觉有点笨拙。
由于
答案 0 :(得分:1)
首先,我同意blindmeis在属性获取器中创建新命令违反了属性获取者的一般期望,包括:
但这是不重要的,所以我不会劳动它。
至于你的问题,我建议你研究一种服务模式,你可以为服务定义一个接口,然后你的视图模型依赖于该服务。他们获得服务的方式多种多样。您可能希望从service locator pattern开始,或者查看dependency injection或MEF。
答案 1 :(得分:1)
您已经提到的发布/订阅者模式将是我的首选方法。 Prism与EventAggregator
有很好的实现。
除了代码解耦之外,设置它的好处是,您可以更清晰地推理您的问题域。您可以将视图模型作为独立的“孤岛”,通过系统发送明确定义的(域语言)消息。视图模型不必知道其他部分如何作用于它们。这些消息是系统的概念上不可或缺的一部分,值得建模。它还简化了测试并简化了任务,以引入新功能并修复与这些消息交互的错误。