c# - 来自 subview 的 MainWindow ViewModel 引用

标签 c# wpf mvvm

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

private readonly Main_ViewModel _mainVM;
public VM_ListadoClientes(Main_ViewModel MainVM)
    {
        _mainVM = MainVM;
    }        

在后面的 subview 代码中,我有这个:
private VM_ListadoClientes viewModel = new VM_ListadoClientes(???);

    public ViewClientes()
    {
        InitializeComponent();
        this.Loaded += (s, e) => { this.DataContext = this.viewModel; };  
    }

那么我如何获得对 mainWindow viewmodel 的引用以传入“???”范围?

另外:这会破坏 mvvm 模式吗?因为 subview 知道主窗口 View 模型的存在。

谢谢!

更新

我尝试将此作为 EventAggregator 类:
class EventAggregator
{
    public static void BroadCast(string message)            
    {
        if (OnMessageTransmitted != null)
            OnMessageTransmitted(message);
    }

    public static Action<string> OnMessageTransmitted;        
}

但我不喜欢静态的想法,这意味着所有应用程序都是通用的。也许我可以将其设置为特定 View 模型的本地,但我如何为 subview 订阅此事件?谢谢

最佳答案

我将消息传递、事件聚合器等视为 hack,它们将使您的应用程序非常难以管理。为什么不使用固体溶液?我建议使用 Catel ,并会尝试给你几个原因。

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

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

然后你可以在任何你想要的地方执行这个命令,它将通过服务传递给你正确的虚拟机。

2)有扎实的处理基础nested user controls具有单独的 View 模型。

3) 简单地提供您在使用 MVVM 和 XAML 时在应用程序中需要的一切。

关于c# - 来自 subview 的 MainWindow ViewModel 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23172758/

相关文章:

c# - 如何创建没有碎片的 Uri(将 # 转换为 %23)

c# - 没有标签的 HtmlGenericControl

c# - String、FormattableString、IFormattable 之间的区别

c# - 在MediaElement中播放音频时显示一些内容

c# - 未能成功地将我的 ViewModel 数据公开给我的 XAML 绑定(bind) View

c# - Excel 之上的 Windows 窗体

c# - 为什么将整数分配给双重附加属性会出错?

wpf - 是否有一种通用方法可以将鼠标下方的 ItemContainer 的 DataContext 设置为其他控件的属性?

wpf - 在 MVVM 中调用 UserControl 的方法

c# - 将来自不同 ViewModel 的 View 添加到 MainWindow?