【问题标题】:MainWindow ViewModel Reference from child views来自子视图的 MainWindow ViewModel 参考
【发布时间】:2014-04-19 16:48:38
【问题描述】:

这一定是个愚蠢的问题,但我找不到答案。我的应用程序中有一个带有 Viewmodel 的 MainWindow 和带有相应 viewmodel 的子视图。我需要从子视图模型执行主窗口视图模型上定义的命令。我读到我需要使用 IoC 并在创建子视图时传递 mainWindow 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 视图模型的引用以传入“???”范围?

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

谢谢!

更新

我尝试将此作为 EventAggregator 类:

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

    public static Action<string> OnMessageTransmitted;        
}

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

【问题讨论】:

  • 创建ViewClientes 的重载构造函数,接受viewModel 作为参数。理想情况下,您应该使用一些 Mediator 模式或 EventAggregator,以便两个 ViewModel 保持松散耦合。
  • 谢谢?你能举一个 EventAggregator 的基本例子吗?请看我的更新!谢谢!
  • 你为什么要创建EventAggregator? PRISM 已经定义了它。请参考示例hereherehere

标签: c# wpf mvvm


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多