是否可以从子 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
我有一个带有网格的 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