我目前正在编写一个应用程序,复合方法就像手套一样....几乎!
我还需要一种在视图之间导航的方法,包括维护用于向前和向后导航的日志。
结合这两种方法的最佳方法是,一方面是基于Window
的单个CAG shell及其UserControl
派生的视图,另一方面是方便的NavigationWindow
shell及其Page
派生的观点和期刊?
谢谢!
答案 0 :(得分:4)
您可以在NavigationWindow
中显示任何内容,而不只是Pages
。使其工作的一种简单方法是在NavigationWindow
的资源中为要显示的每个ViewModel定义DataTemplate
。将Content
的{{1}}属性绑定到您的主ViewModel的属性,您就完成了:更改该属性将更新NavigationWindow
内容和相应的NavigationWindow
将自动选择
更新
我只是查看了我使用DataTemplate
的项目的代码。实际上我错了,它不能通过绑定NavigationWindow
(或者它可能有效,但这不是我做的)。相反,我创建了一个Content
接口,由我的INavigationService
类实现,它通过调用App
方法来处理导航。这样,导航历史记录由NavigationWindow.Navigate
维护。
以下是我项目的摘录
MainWindow.xaml:
NavigationWindow
App.xaml.cs :
<NavigationWindow x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:MyApp.ViewModel"
xmlns:view="clr-namespace:MyApp.View"
Title="{Binding Content.DisplayName, RelativeSource={RelativeSource Self}, FallbackValue=The Title}"
Height="600" Width="800">
<NavigationWindow.Resources>
<DataTemplate DataType="{x:Type vm:HomeViewModel}">
<view:HomeView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:CustomerViewModel}">
<view:CustomerView />
</DataTemplate>
</NavigationWindow.Resources>
</NavigationWindow>
当我需要导航到另一个视图时,我只需使用ViewModel作为参数调用 ...
private void Application_Startup(object sender, StartupEventArgs e)
{
LoadConfig();
MyApp.MainWindow window = new MainWindow();
INavigationService navigationService = this;
HomeViewModel viewModel = new HomeViewModel(navigationService);
this.MainWindow = window;
window.Navigate(viewModel);
window.Show();
}
方法,WPF会自动从资源中选择适当的Navigate
。