DataTemplates和DataContext继承

时间:2015-04-07 15:06:25

标签: c# wpf datatemplate datacontext

我有以下几个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?目标是从第一个孩子中提取数据,以便在第二个孩子中使用。

谢谢!

1 个答案:

答案 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);