我有一个带有网格的窗口,该窗口的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有了更好的了解,请随时分享:)
谢谢
答案 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类中