【问题标题】:Is it possible to get the DataContext(ViewModel) of a parent view element from within a childs DataContext(ViewModel)?是否可以从子数据上下文(视图模型)中获取父视图元素的数据上下文(视图模型)?
【发布时间】:2019-12-22 07:54:26
【问题描述】:

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

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

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

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

在 MainWindowViewModel 我有一个属性“用户”。我想从页面的 ViewModel 访问这个属性。

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

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

谢谢

【问题讨论】:

  • 如果您只想在用户更改时将其值发送到另一个视图模型,这可以使用事件聚合器来实现,请参阅此帖子blog.magnusmontin.net/2014/02/28/… 如果您想尝试这条路线,我会推荐 Caliburn微而不是棱镜caliburnmicro.com
  • @erotavlas 效果很好。如果您将此作为答案发布,我会接受此作为答案。

标签: c# wpf xaml mvvm datacontext


【解决方案1】:

我建议尝试 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 类中

【讨论】:

  • 像@erotavlas 建议的那样使用棱镜的事件聚合器。但由于它们是非常相似的方法,我认为这也适用。
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2021-01-09
  • 2011-04-16
  • 2012-06-02
  • 2017-05-04
  • 2013-02-22
  • 2019-02-01
相关资源
最近更新 更多