Как использовать Dependency Injection между базовым проектом и приложением WPF с изменением страниц? - PullRequest
0 голосов
/ 30 мая 2018

Я создаю WPF программу с использованием MVVM Framework, а также Ninject для Dependancy Injection.Я создал два проекта: .Net Class Library Базовый проект для использования с другими .Net Приложениями и WPF специальное приложение.

В настоящее время я меняю страницы своего приложения, используя ApplicationViewModel и Property CurrentPage.CurrentPage - это тип Enum с именем ApplicationPage, содержащий различные страницы в моем приложении.В MainWindow моего WPF-приложения находится фрейм, чей Content равен bound к CurrentPage Property и использует конвертер значений для преобразования значения в другое CustomPages, которое я сделал с помощью статуи switch, например, так:

if (value is ApplicationPage)
    switch ((ApplicationPage)value)
    {
        case ApplicationPage.PageOne:
            return new PageOne();
        case ApplicationPage.PageTwo:
            return new PageTwo();
        default:
            throw Exception;
    }
}

Я хотел бы использовать Constructor Injection для передачи View Models для этих страниц в Page's Constructor в пределах Converter, используя ViewModels, которые впревратить Injected в ApplicationViewModel класс, вроде как:

case ApplicationPage.PageOne:
    return new PageOne(PageOneViewModel);

Моя первая мысль была, есть ли способ сделать CurrentPage Property на самом деле конкретным ViewModelи выполнить switch, на котором ViewModel, чтобы Converter преобразовал ViewModel в Page?

Однако Type из CurrentPage является проблемой, так как его нужно установить на один из ViewModels, и поэтому он не может принимать значение другого ViewModel, оставляя васзастрял только с одним ViewModel Class для работы.

Мои мысли таковы: есть ли способ перейти от ViewModel к Converter?Или я могу установить CurrentPage на IViewModelFactory и создать ViewModel в конвертере с завода?В каком случае, как бы я изменил значение CurrentPage, чтобы изменить страницу в приложении?

Есть ли способ придерживаться Dependency Injection, следуя этой логике, или есть другой способ, и мне нужно переосмыслить свой код для изменения страницы?К сожалению, большинство примеров, которые я видел, попали в так называемый ServiceLocator анти-шаблон.

1 Ответ

0 голосов
/ 08 июня 2018

Ответ заключается в использовании шаблонов данных следующим образом:

<Window.Resources>
    <DataTemplate x:Key="View1Template" DataType="{x:Type local:MainWindowViewModel}">
        <!-- Custom control style with a Data Context set to a Viewmodel 
        object in the MainWindowViewModel -->
        <local:CustomPage1 DataContext="{Binding CustomPage1ViewModel}" />
    </DataTemplate>

    <DataTemplate x:Key="View2Template" DataType="{x:Type local:MainWindowViewModel}">
        <!-- Custom control style with a Data Context set to a Viewmodel 
        object in the MainWindowViewModel -->
        <local:CustomPage2 DataContext="{Binding CustomPage2ViewModel}" />
    </DataTemplate>
</Window.Resources>

Затем установка Data Trigger в пределах Content Control Style;

<ContentControl Content="{Binding}">
    <ContentControl.Style>
        <Style TargetType="{x:Type ContentControl}">

            <!-- The Default/initial View being shown -->
            <Setter Property="ContentTemplate" Value="{StaticResource View1Template}" />

            <!-- Triggers bound to the CurrentView Property -->
            <Style.Triggers>
                <DataTrigger Binding="{Binding CurrentView}" Value="1">
                    <Setter Property="ContentTemplate" Value="{StaticResource View1Template}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding CurrentView}" Value="2">
                    <Setter Property="ContentTemplate" Value="{StaticResource View2Template}" />
                </DataTrigger>
            </Style.Triggers>

        </Style>
    </ContentControl.Style>
</ContentControl>

CurrentView является свойствомэто можно изменить в коде на Trigger, а изменение UI - можно установить на Enum из PageNames.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...