使用两个视图并在视图之间切换
Using Two Views and switch between Views
我在 link 上看到示例,如何在两个视图之间切换。最简单的解决方案,非常适合我的应用程序 - 我也将只有两个视图。
所以我们有一个父视图 (MainWindow) 和两个子视图。父视图有两个按钮可以在这两个视图("First View" 和 "Second View")之间切换,它们位于 "DockPanel".
我的问题是如何使用 "First View" 中的任何按钮切换到第二个视图,以及如何使用 "Second View" 中的按钮返回到 "First View"。我想要的是摆脱 DockPanel 并使用 View 中的按钮。
请教如何操作。如有任何问题请提问。谢谢!
由于您使用的是 MVVM light,因此您应该考虑使用 Messenger 系统 (Good tutorial here)。一种简单的方法是在第一个视图中发送 NotificationMessage,如下所示:
Messenger.Default.Send<NotificationMessage>(new NotificationMessage("GotoSecondView"));
然后在您的主 window 中,您将按如下方式注册接收它:
Messenger.Default.Register<NotificationMessage>(this, NotificationReceived);
后跟一个函数来处理它们:
private void NotificationReceived(NotificationMessage message)
{
string notice = message.Notification;
switch (notice)
{
case "GotoSecondView":
ExecuteSecondViewCommand
break;
}
}
对另一个视图重复相同的想法并将其添加到您的开关。然后您可以从任何地方触发,主视图将处理更改,而无需直接 link 您的视图模型。
您可以使用来自每个子视图模型的事件来通知父视图更改视图。因此,在下面的代码中,在 View1(绑定到 ViewModel1)上按下 ButtonOnViewModel1Command,这会引发 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);
}
}
我在 link 上看到示例,如何在两个视图之间切换。最简单的解决方案,非常适合我的应用程序 - 我也将只有两个视图。
所以我们有一个父视图 (MainWindow) 和两个子视图。父视图有两个按钮可以在这两个视图("First View" 和 "Second View")之间切换,它们位于 "DockPanel".
我的问题是如何使用 "First View" 中的任何按钮切换到第二个视图,以及如何使用 "Second View" 中的按钮返回到 "First View"。我想要的是摆脱 DockPanel 并使用 View 中的按钮。
请教如何操作。如有任何问题请提问。谢谢!
由于您使用的是 MVVM light,因此您应该考虑使用 Messenger 系统 (Good tutorial here)。一种简单的方法是在第一个视图中发送 NotificationMessage,如下所示:
Messenger.Default.Send<NotificationMessage>(new NotificationMessage("GotoSecondView"));
然后在您的主 window 中,您将按如下方式注册接收它:
Messenger.Default.Register<NotificationMessage>(this, NotificationReceived);
后跟一个函数来处理它们:
private void NotificationReceived(NotificationMessage message)
{
string notice = message.Notification;
switch (notice)
{
case "GotoSecondView":
ExecuteSecondViewCommand
break;
}
}
对另一个视图重复相同的想法并将其添加到您的开关。然后您可以从任何地方触发,主视图将处理更改,而无需直接 link 您的视图模型。
您可以使用来自每个子视图模型的事件来通知父视图更改视图。因此,在下面的代码中,在 View1(绑定到 ViewModel1)上按下 ButtonOnViewModel1Command,这会引发 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);
}
}