【问题标题】:Using Two Views and switch between Views使用两个视图并在视图之间切换
【发布时间】:2015-10-25 18:18:25
【问题描述】:

我看到了这个link 的例子,如何在两个视图之间切换。最简单的解决方案,非常适合我的应用程序 - 我也只有两个视图。

所以我们有一个父视图(MainWindow)和两个子视图。父视图具有专用的两个按钮,用于在位于“DockPanel”中的这两个视图(“第一视图”和“第二视图”)之间切换。

我的问题是如何使用“第一个视图”中的任何按钮切换到第二个视图和“第二个视图”按钮返回到“第一个视图”。我想要的是摆脱 DockPanel 并使用 View 中的按钮。

请提供建议,如何做到这一点。如果有任何问题请询问。谢谢!

【问题讨论】:

    标签: c# wpf mvvm view user-controls


    【解决方案1】:

    您可以使用来自每个子视图模型的事件来指示父视图更改视图。因此,在下面的代码中,在 View1(绑定到 ViewModel1)上按下了 ButtonOnViewModel1Command,这会引发 SwitchViewModel2Request 事件。 MainViewModel 订阅此事件并将 CurrentViewModel 集合切换到 ViewModel2。您可以在 ViewModel2 上执行相同的操作以切换回 ViewModel1。

     public class MainViewModel
    {
        private ViewModel1 _viewModel1 = new ViewModel1();
        private ViewModel2 _viewModel2 = new ViewModel2();
    
        public MainViewModel()
        {
            //event from ViewModel1 
            _viewModel1.SwitchViewModel2Request += NavigateToView2;
        }
    
        //switch View to ViewModel2
        private void NavigateToView2(object sender, EventArgs e)
        {
            CurrentViewModel = _viewModel2;
        }
    }
    public class ViewModel1
    {
        public ViewModel1()
        {
            ButtonOnViewModel1Command = new RelayCommand(Button1Method);
        }  
        //some button on child view 1
        public RelayCommand ButtonOnViewModel1Command { get; set; }
    
    
        private void Button1Method(object obj)
        {
            OnSwitchViewModel2Request();
        }
    
        //event that MainViewModel will subscribe to
        public event EventHandler SwitchViewModel2Request = delegate { };
        private void OnSwitchViewModel2Request()
        {
            SwitchViewModel2Request(this, EventArgs.Empty);
        }
    }
    

    【讨论】:

      【解决方案2】:

      由于您使用的是 MVVM light,因此您应该考虑使用信使系统 (Good tutorial here)。一种简单的方法是在第一次查看时发送 NotificationMessage,如下所示:

      Messenger.Default.Send<NotificationMessage>(new NotificationMessage("GotoSecondView"));
      

      然后在您的主窗口中,您将按如下方式注册接收它:

      Messenger.Default.Register<NotificationMessage>(this, NotificationReceived);
      

      后跟一个函数来处理它们:

          private void NotificationReceived(NotificationMessage message)
          {
              string notice = message.Notification;
      
              switch (notice)
              {
                  case "GotoSecondView":
                      ExecuteSecondViewCommand
                      break;
              }
          }
      

      对另一个视图重复相同的想法并将其添加到您的开关中。然后您可以从任何地方触发,主视图将处理更改,而无需直接链接您的视图模型。

      【讨论】:

      • 对不起。我忘了提到与链接示例的唯一区别是:我不会使用 MVVM Light。对不起!感谢您的链接,无论如何我都会概述,也许有解决方案。谢谢!
      • 理想情况下,您想使用我发布的内容。如果您想变得简单而不理想,那么只需在创建它们时将主窗口实例传递给第一个和第二个视图,并在其上有一个可以调用以更改视图的函数。
      • 谢谢。我会试试的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 2015-09-23
      • 1970-01-01
      • 2011-11-01
      • 2011-01-26
      相关资源
      最近更新 更多