子视图中的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的本地视图,但如何为该事件订阅子视图?感谢

子视图中的MainWindow ViewModel引用

我认为消息传递、事件聚合器等都是黑客,它们会使您的应用程序变得非常不可管理。为什么不使用固体溶液?我建议使用Catel,并会尝试给你一些原因。

1) 它提供了一个CommandManager类,您可以在其中使用输入手势注册应用程序范围的命令。这允许你像这样在xaml中绑定:

<Button Command="{catel:CommandManagerBinding File.Exit}" />

然后,您可以在任何需要的地方实现此命令,它将通过服务传递给您的正确VM。

2) 有坚实的基础来处理具有独立视图模型的嵌套用户控件。

3) 在使用MVVM和XAML时,只需在应用程序中提供所需的一切。