使用两个视图并在视图之间切换

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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。对不起!感谢您的链接,无论如何我都会概述,也许有解决方案。谢谢! 理想情况下,您想使用我发布的内容。如果您想变得简单而不理想,那么只需在创建它们时将主窗口实例传递给第一个和第二个视图,并在其上有一个可以调用以更改视图的函数。 谢谢。我会试试的。

以上是关于使用两个视图并在视图之间切换的主要内容,如果未能解决你的问题,请参考以下文章

layoutAnimation 在两个视图之间切换时会在 Android 上导致额外的蓝色背景

如何在可见的两个视图之间切换?

Vue:在同一组件的两个实例之间切换不会更新视图

添加、删除子视图并在子视图和主 uiviewcontroller 之间进行通信

切换视图时标签栏丢失

如何并排绑定两个视图