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

C# 使用两个视图并在视图之间切换,c#,wpf,mvvm,view,user-controls,C#,Wpf,Mvvm,View,User Controls,我看到了这个例子,如何在两个视图之间切换。最简单的解决方案和完美的应用程序-我也将只有两个视图 因此,我们有一个父视图(主窗口)和两个子视图。父视图有两个Dedicade按钮,用于在“DockPanel”中的这两个视图(“第一视图”和“第二视图”)之间切换 我的问题是如何使用“第一视图”中的任何按钮切换到第二视图,以及如何使用“第二视图”按钮返回到“第一视图”。我想要的是摆脱DockPanel,从视图中使用按钮 请您提供建议,如何做到这一点。如果有任何问题,请提问。谢谢 既然您使用的是MVVM

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

因此,我们有一个父视图(主窗口)和两个子视图。父视图有两个Dedicade按钮,用于在“DockPanel”中的这两个视图(“第一视图”和“第二视图”)之间切换

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


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

既然您使用的是MVVM light,您应该考虑使用messenger系统()。一种简单的方法是在第一个视图中发送通知消息,如下所示:

Messenger.Default.Send<NotificationMessage>(new NotificationMessage("GotoSecondView"));
Messenger.Default.Register<NotificationMessage>(this, NotificationReceived);

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

您可以使用每个子viewmodel的事件来通知父视图更改视图。因此,在下面的代码按钮中,View1(绑定到VIEWMODEL 1)上按NONVIEWMODEL1命令会引发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灯。很抱歉谢谢你的链接,不管怎样,我还是要概述一下,也许解决方案就在那里。谢谢理想的情况是你想用我贴的东西。如果你想变得非常简单而不理想,那么在主窗口实例创建第一个和第二个视图时,只需将其传递给第一个和第二个视图,并且在其上有一个函数,它们可以调用以更改视图。谢谢。我试试看。
 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);
    }
}