我有以下几个XAML:
Window.DataContext>
<viewModel:ProductBuilderVm/>
</Window.DataContext>
<UNNECESSARY DETAILS SNIP>
<TabControl ItemsSource="{Binding TabViewModels}" SelectedItem="{Binding SelectedTabVm}">
<TabControl.Resources>
<DataTemplate DataType="{x:Type viewModel:ProductDefinitionVm}">
<view:ProductDefinition></view:ProductDefinition>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:CouplingsViewVm}">
<view:CouplingsView></view:CouplingsView>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:RulesVm}">
<view:RulesView></view:RulesView>
</DataTemplate>
</TabControl.Resources>
</TabControl>
我的想法是创建一个主ViewModel(ProductBuilderVm)作为父母&#39;到TabControl中的三个ViewModel。我以为我有这个工作,但是现在我试图在这些孩子之间进行交流,我开始意识到他们每个人都是一个彼此无关的独立实例。
如何重构此窗口以获得1个ProductBuilderVm,其下面有3个子Vm?目标是从第一个孩子中提取数据,以便在第二个孩子中使用。
谢谢!
答案 0 :(得分:1)
我能想到在ViewModels之间实现传递值的最简单方法是使用类似MVVM Light Messenger类的东西:https://msdn.microsoft.com/en-us/magazine/dn745866.aspx。
您注册每个ViewModel以接收消息:
//Register for custom typed message
Messenger.Default.Register<MyMessageType>(this, OnMyMessageTypeReceived);
//Register for string messages
Messenger.Default.Register<NotificationMessage>(this, NotificationMessageReceived);
然后您可以使用以下命令向ViewModel发送消息:
//String message
Messenger.Default.Send(new NotificationMessage("SetupMyProductDefinitionVm"));
//Custom typed message sent to ViewModel of specific type
var myMsg = new MyMessageType();
Messenger.Default.Send<MyMessageType, ProductDefinitionVm>(myMsg);