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

Is it possible to get the DataContext(ViewModel) of a parent view element from within a childs DataContext(ViewModel)?

我有一个带有网格的 Window,它有一个 "MainWindowViewModel" 设置为其 DataContext

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

这个主网格有两个子网格(未命名),其中一个包含一个显示页面的框架。 显示的页面将其他 ViewModel 设置为其 DataContext。

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

在 MainWindowViewModel 中我有一个 属性 "User"。我想从页面的 ViewModel 访问这个 属性。

这是否可能(不使用 "code behind")。我真的不知道从哪里开始,因为我不知道如何从 ViewModel 中使用 ViewModel 获取 FrameworkElement(我猜从那里它只处理可视化树?)

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

谢谢

我建议试用 MVVM Light 的 Messenger。 解释的够透彻了here

您创建了一个 class 放置要在 ViewModels 之间发送的对象 属性

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 中 classes