这一定是一个愚蠢的问题,但我找不到答案。我的应用程序中有一个带有 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/