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

时间:2015-10-25 18:18:26

标签: c# wpf mvvm view user-controls

我在这个link上看到了如何在两个视图之间切换的例子。最简单的溶解,非常适合我的应用 - 我也只有两种观点。

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用每个子视图模型中的事件来通知父级更改视图。因此,在下面的代码中,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);
    }
}

答案 1 :(得分:1)

由于您正在使用MVVM灯,因此您应该使用信使系统(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;
        }
    }

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