WPF: составное приложение с навигацией по страницам - PullRequest
0 голосов
/ 19 января 2010

В настоящее время я пишу приложение, для которого составная методология подходит как перчатка ... почти!

Мне также нужен способ навигации между представлениями, включая ведение журнала для навигации назад и вперед.

Как лучше всего объединить эти две методологии, с одной стороны, единую оболочку CAG на основе Window с ее UserControl производными представлениями, а с другой стороны, удобную оболочку NavigationWindow с ее Page производных просмотров и журнала?

Спасибо!

1 Ответ

4 голосов
/ 19 января 2010

Вы можете отобразить что угодно в NavigationWindow, а не только Pages. Простой способ заставить это работать - определить в ресурсах NavigationWindow DataTemplate для каждой ViewModel, которую вы хотите отобразить. Свяжите свойство Content NavigationWindow со свойством вашей основной ViewModel, и все готово: изменение этого свойства обновит содержимое NavigationWindow, и соответствующий DataTemplate будет выбран автоматически


UPDATE

Я только что посмотрел код моего проекта, где я использовал NavigationWindow. На самом деле я ошибся, это не работает, связывая Content (или, может быть, это работает, но это не то, что я сделал). Вместо этого я создал интерфейс INavigationService, реализованный моим классом App, который обрабатывает навигацию, вызывая метод NavigationWindow.Navigate. Таким образом, история навигации поддерживается NavigationWindow.

Вот выдержка из моего проекта

MainWindow.xaml:

<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>

App.xaml.cs :

    ...

    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();
    }

Когда мне нужно перейти к другому представлению, я просто вызываю метод Navigate с ViewModel в качестве параметра, и WPF автоматически выбирает соответствующий DataTemplate из ресурсов.

...