【问题标题】:DataTemplates and DataContext inheritanceDataTemplates 和 DataContext 继承
【发布时间】:2015-04-07 15:06:25
【问题描述】:

我有以下 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>

我的想法是创建 1 个主 ViewModel (ProductBuilderVm) 作为 TabControl 中三个 ViewModel 的“父级”。我以为我有这个工作,但现在我试图在这些子虚拟机之间进行交流,我意识到它们都是一个独立的实例,彼此没有关系。

如何重构此窗口以拥有 1 个 ProductBuilderVm,其下方有 3 个子 Vm?目标是从第一个孩子那里提取数据以供第二个孩子使用。

谢谢!

【问题讨论】:

  • 你也可以让 parentVm 存储对 3 个子 vm 的引用

标签: c# wpf datatemplate datacontext


【解决方案1】:

我能想到的在 ViewModel 之间传递值的最简单方法是使用类似 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2010-10-21
    • 1970-01-01
    相关资源
    最近更新 更多