这一定是个愚蠢的问题,但我找不到答案。我在我的应用程序中有一个带有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的本地,但我如何订阅子视图到此事件?感谢
答案 0 :(得分:0)
我认为消息传递,事件聚合器等是黑客攻击,它们会使您的应用程序非常难以管理。为什么不使用可靠的解决方案?我建议使用Catel,并尝试给您一些理由。
1)它提供了一个CommandManager类,您可以在其中使用输入手势注册应用程序范围的命令。这允许你像这样绑定xaml:
<Button Command="{catel:CommandManagerBinding File.Exit}" />
然后您可以在任何地方实现此命令,并通过服务将其传递给正确的VM。
2)具有通过单独的视图模型处理nested user controls的坚实基础。
3)使用MVVM和XAML时,只需提供应用程序中所需的一切。