我看到这个链接上的例子,如何在两个视图之间切换。最简单的解决方案和完美的我的应用程序-我也将只有两个视图。
所以我们有一个父视图(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;
}
}
对另一个视图重复相同的想法,并将其添加到交换机。然后,您可以从任何地方触发,主视图将处理更改,而无需直接链接您的视图模型。