子视图中的MainWindow ViewModel引用
本文关键字:ViewModel 引用 MainWindow 视图 | 更新日期: 2023-09-27 17:59:11
这肯定是个愚蠢的问题,但我找不到答案。我的应用程序中有一个带有Viewmodel的MainWindow和带有相应Viewmodel的子视图。我需要从子视图模型执行在mainWindowViewModel上定义的命令。我读到我需要在创建子视图时使用IoC并传递mainWindowViewModel的引用,但我不知道怎么做!在Child视图模型构造函数上,我有这个:
private readonly Main_ViewModel _mainVM;
public VM_ListadoClientes(Main_ViewModel MainVM)
{
_mainVM = MainVM;
}
在儿童视图代码后面我有这样的:
private VM_ListadoClientes viewModel = new VM_ListadoClientes(???);
public ViewClientes()
{
InitializeComponent();
this.Loaded += (s, e) => { this.DataContext = this.viewModel; };
}
那么,如何获得对mainWindow视图模型的引用以传递"??"参数呢?
还有:这会打破mvvm模式吗?因为子视图知道主窗口视图模型的存在。
谢谢!
更新
我尝试作为EventAggregator类:
class EventAggregator
{
public static void BroadCast(string message)
{
if (OnMessageTransmitted != null)
OnMessageTransmitted(message);
}
public static Action<string> OnMessageTransmitted;
}
但我不喜欢静态的想法,这意味着它对所有应用程序都是通用的。也许我可以将其设置为特定viewModel的本地视图,但如何为该事件订阅子视图?感谢
我认为消息传递、事件聚合器等都是黑客,它们会使您的应用程序变得非常不可管理。为什么不使用固体溶液?我建议使用Catel,并会尝试给你一些原因。
1) 它提供了一个CommandManager类,您可以在其中使用输入手势注册应用程序范围的命令。这允许你像这样在xaml中绑定:
<Button Command="{catel:CommandManagerBinding File.Exit}" />
然后,您可以在任何需要的地方实现此命令,它将通过服务传递给您的正确VM。
2) 有坚实的基础来处理具有独立视图模型的嵌套用户控件。
3) 在使用MVVM和XAML时,只需在应用程序中提供所需的一切。