【问题标题】:Passing values between Viewmodel in MVVM in WPF在 WPF 中的 MVVM 中的 Viewmodel 之间传递值
【发布时间】:2013-02-02 17:39:48
【问题描述】:

我正在使用 MVVM 轻型工具包开发 WPF 应用程序。我的主窗口中有一个数据网格。我创建了另一个名为“openfile”的窗口,它们的视图模型。主窗口视图模型类包含 ObservableCollection MyList 类型的公共属性,该属性绑定到Datagrid。我能否从 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;
            }
        }

提前致谢。 罗希尔K

【问题讨论】:

  • 您能否为您所描述的场景提供一些示例代码?如果 MyList 已绑定到 Datagrid,则对列表的任何更新都应自动更新您的网格。如果 MyList 是公共属性,并且打开的文件 VM 具有对您的主 VM 的引用,那么您应该能够直接填充它。
  • 如何打开OpenFile视图?
  • 我正在从菜单栏打开 OpenFile 窗口。
  • 我的意思是你如何通过代码做到这一点。显示代码!
  • 我使用 MVVM Light 工具包的“消息”技术打开 openFile 菜单。

标签: wpf silverlight mvvm mvvm-light


【解决方案1】:

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

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

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

谢谢大家..

【讨论】:

    【解决方案2】:

    您可以创建一个可以作为“中介服务”的类,它将位于您的 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
    }
    

    希望对你有所帮助..

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        • 2020-03-03
        • 2013-10-21
        • 2015-12-19
        • 1970-01-01
        • 1970-01-01
        • 2011-07-22
        相关资源
        最近更新 更多