ViewModel 到 ViewModel 的通信通常由事件聚合器模式的实现来处理。
MVVM Light 使用Messenger 类,Prism 有另一种实现,但基本上这是在视图模型之间发送消息而不耦合的一种方式。
有一些例子,Articles 描述了用法。
我建议你看看它。
关于 WPF 中的控制器的东西,我不知道。
关于示例:
-我有一个带有 WindowsViewModel 的 Windows。这个类应该有一个绑定到按钮的命令。
-用户单击按钮。执行命令。
-命令打开一个新窗口。
在这里您应该创建对话框视图模型,并且您应该以某种方式创建窗口。或者使用 ViewModel 创建 Window,但 ViewModel 不应该对 View 了解太多,否则无法测试。
我们使用这样的东西是因为我们有一些要求,但它
可能要简单得多,碰巧这是我手头唯一的例子:
bool? ShowDialogImpl<TViewModel>(Action<TViewModel> setup) where TViewModel : ViewModel
{
return (bool?)DispatcherHelper.UIDispatcher.Invoke(
(Func<bool?>)(() =>
{
var viewModel = viewModelFactory.Get<TViewModel>();
viewModel.ViewService = this;
setup(viewModel);
var window = new Window
{
Owner = this,
SizeToContent = SizeToContent.WidthAndHeight,
WindowStartupLocation = WindowStartupLocation.CenterOwner,
Content = ViewFactory.CreateView<TViewModel>(),
DataContext = viewModel,
WindowStyle = WindowStyle.ToolWindow,
ShowInTaskbar = false
};
window.SetBinding(TitleProperty, new Binding("Title"));
openDialogs.Push(window);
window.Activated += (sender, args) => window.SizeToContent = SizeToContent.Manual;
var result = window.ShowDialog();
openDialogs.Pop();
viewModelFactory.Release(viewModel);
return result;
}));
}
基本上:我们创建一个窗口和一个视图模型。
视图模型是使用容器从工厂创建的。
setup Action 委托是我们数据的入口点。
第一个 Windows 是一个 Grid,第二个 Dialog 用于编辑网格的数据。
在我们拥有的 Windows 中:
messenger.Register<EntityUpdated<FooClass>>(this, message => UpdateItem(message.Entity));
在对话框中:
messenger.Send(new EntityUpdated<FooClass>(subject));
这样,我们就知道何时在编辑对话框中更新了某些内容以刷新网格。
希望对你有帮助:)