MainWindow ViewModel来自子视图的引用

时间:2014-04-19 16:48:38

标签: c# wpf mvvm

这一定是个愚蠢的问题,但我找不到答案。我在我的应用程序中有一个带有Viewmodel的MainWindow和带有相应viewmodel的子视图。我需要从子viewmodel执行一个在mainWindow ViewModel上定义的命令。我读到我需要使用IoC并在创建子视图时传递mainWindow ViewModel的引用,但我不知道如何! 在Child viewmodel构造函数我有这个:

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 viewmodel的引用以传入“???”参数?

另外:这样做打破mvvm模式?因为子视图知道主窗口视图模型存在。

谢谢!

更新

我尝试将其作为EventAggregator类:

class EventAggregator
{
    public static void BroadCast(string message)            
    {
        if (OnMessageTransmitted != null)
            OnMessageTransmitted(message);
    }

    public static Action<string> OnMessageTransmitted;        
}

但我不喜欢静态的想法,这意味着所有应用程序都是通用的。也许我可以将它设置为特定viewModel的本地,但我如何订阅子视图到此事件?感谢

1 个答案:

答案 0 :(得分:0)

我认为消息传递,事件聚合器等是黑客攻击,它们会使您的应用程序非常难以管理。为什么不使用可靠的解决方案?我建议使用Catel,并尝试给您一些理由。

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

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

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

2)具有通过单独的视图模型处理nested user controls的坚实基础。

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