在WPF中的MVVM中的Viewmodel之间传递值

时间:2013-02-18 10:10:12

标签: wpf silverlight mvvm mvvm-light

我正在使用MVVM光工具包开发WPF应用程序。我在Mainwindow中有一个数据网格。我创建了另一个名为“openfile”的窗口,他们的viewmodels.Main Window viewmodel类包含ObservableCollection类型的公共属性,它被绑定到Datagrid.Can我能从openfile Viewmodel中填充这个属性并自动绑定到Datagrid吗?或者我可以将变量传递给MainViewmodel并从OpenfileViewmodel调用MainViewmodel中的公共函数吗?

这是我如何从菜单栏调用MyPage。

 private void NotificationMessageReceived(NotificationMessage msg)
        {
            switch (msg.Notification)
            {
                case Messages.MainVM_Notofication_ShowNewbWindow:
                    new NewView().ShowDialog();
                    break;
                case Messages.MainVM_Notofication_ShowExistingWindow:
                    new OpenExisitingView().ShowDialog();
                    break;

                case Messages.MainVM_Notofication_ShowotherWindow:
                    newView().ShowDialog();
                    break;
            }
        }

先谢谢。 Roshil K

3 个答案:

答案 0 :(得分:3)

经过一番研究后,我通过以下代码获得了Mainviewmodel的Current实例。

MainViewModel mainViewModelInstaince = ServiceLocator.Current.GetInstance<MainViewModel>();

然后我获得了所有方法和属性..并绑定了另一个视图模型中的数据。

感谢所有..

答案 1 :(得分:1)

最简单的方法是将MainWindowViewModel的实例传递给OpenFileViewModel

public class OpenFileViewModel
{
    private MainWindowViewModel _parent;

    public OpenFileViewModel(MainWindowViewModel parent)
    {
          _parent = parent;
    }
}

之后,您可以在MainWindowViewModel中调用/访问任何公共方法/属性:

foreach (var item in _parent.myList)
{
    ...
}

答案 2 :(得分:1)

您可以创建一个可以作为“中介服务”的类,它将位于您的ViewModel之间。您可以注册中介服务并添加可以从一个VM引发并在另一个VM中处理的事件。它可以像:

public class MediatorService: IMediatorService 
{
  public dynamic Data { get; set;}
  public event EventHandler<YourCustomEventArgs> Callback = delegate { }
}

public class XYZVM(IMediatorService mediatorService)
{
// set your Data here and handle Callback event here and refresh your grid.
// you can get anything from your "YourCustomEventArgs" which you will set from ABCVM
}

public class ABCVM(IMediatorService mediatorService)
{
// get your data here and raise callback here and handle that in XYZVM
}

希望这能帮到你..