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



我看到这个链接上的例子,如何在两个视图之间切换。最简单的解决方案和完美的我的应用程序-我也将只有两个视图。

所以我们有一个父视图(MainWindow)和两个子视图。父视图有专门的两个按钮来切换这两个视图("第一视图"one_answers"第二视图"),位于"DockPanel"。

我的问题是如何使用"第一视图"中的任何按钮切换到第二视图,并在"第二视图"按钮返回到"第一视图"。我想要的是摆脱DockPanel和使用按钮从视图。

如何做那件事,请多请教。如有问题请提。谢谢!

您可以使用来自每个子视图模型的事件来通知父视图更改视图。因此在下面的代码中,ButtonOnViewModel1Command在View1(绑定到ViewModel1)上按下,这会引发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);
    }
}

既然你正在使用MVVM光,你应该考虑使用信使系统(这里有很好的教程)。在第一个视图上发送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;
        }
    }

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

最新更新