我在这个link上看到了如何在两个视图之间切换的例子。最简单的溶解,非常适合我的应用 - 我也只有两种观点。
所以我们有一个父视图(MainWindow)和两个子视图。父视图有两个按钮可以在这两个视图(“第一视图”和“第二视图”)之间切换,它们位于“DockPanel”中。
我的问题是如何使用“第一视图”中的任何按钮切换到第二个视图,并在“第二视图”按钮中返回“第一视图”。我想要的是摆脱DockPanel并使用View中的按钮。
请提出建议,如何做到这一点。如果有任何问题请询问。谢谢!
答案 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;
}
}
对其他视图重复相同的想法并将其添加到您的交换机。然后,您可以从任何地方触发,主视图将处理更改,而无需直接链接您的视图模型。