是否可以从子级DataContext(ViewModel)中获取父视图元素的DataContext(ViewModel)?

时间:2019-08-15 22:43:16

标签: c# wpf xaml mvvm datacontext

我有一个带有网格的窗口,该窗口的DataContext设置为“ MainWindowViewModel”

<Grid x:Name="MainGrid">
    <Grid.DataContext>
        <view:MainWindowViewModel/>
    </Grid.DataContext>
<!-- ... -->
</Grid>

此MainGrid具有两个SubGrid(未命名),其中一个包含一个显示Pages的框架。 显示的页面将其他ViewModel设置为其DataContext。

<Page.DataContext>
    <view:AddOrderViewModel/>
</Page.DataContext>

在MainWindowViewModel中,我有一个属性“ User”。我想从页面的ViewModel访问此属性。

是否有可能(无需使用“后面的代码”)。我真的不知道从哪里开始,因为我不知道如何从ViewModel内使用ViewModel获取FrameworkElement(我猜在那里只能处理视觉树吗?)

任何帮助或朝正确方向推进将不胜感激。另外,如果您对如何将属性从一个ViewModel传递给另一个ViewModel有了更好的了解,请随时分享:)

谢谢

1 个答案:

答案 0 :(得分:0)

我建议尝试MVVM Light的Messenger。 here

进行了足够详尽的解释

您创建一个类,在其中放置要在ViewModel之间发送的对象属性

public class MessageClassName
{
    public object MyProperty { get; set;}
}

假设要将属性从ViewModel1发送到ViewModel2,则在ViewModel1中创建一个方法

private void SendProperty(object myProperty)
{
    Messenger.Default.Send<MessageClassName>(new MessageClassName() { MyProperty = myProperty });
}

然后,当您希望发送代码时,便从代码中调用它。

SendProperty(_myProperty);

在ViewModel2的构造函数中,您注册到该消息

public ViewModel2()
{
    Messenger.Default.Register<MessageClassName>(this, (message) =>
    {
         ReceiveProperty(message.MyProperty);
    )};
}

然后还在ViewModel2中定义方法ReceiveProperty

private void ReceiveProperty(object myProperty)
{
    ...Do whatever with myProperty here...
}

请注意,您需要添加

using GalaSoft.MvvmLight.Messaging;

在ViewModel1和ViewModel2类中