Как перемещаться между View с Prism 7.2? - PullRequest
0 голосов
/ 08 октября 2019

Я пишу приложение и хочу включить в него навигацию. Это приложение использует WPF, и я использую Prism 7.2.0.1367.

Итак, я создал 2 вида: HomePage и ModeFileAttente.

Я также используюШаблон MVVM.

Вот мой app.xaml.cs:

public partial class App : PrismApplication
{
    protected override Window CreateShell()
    {
        return Container.Resolve<V.HomePage>();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    { 
        containerRegistry.RegisterDialog<V.HomePage, VM.HomePageViewModel>();
        containerRegistry.RegisterDialog<V.ModeFileAttente, VM.ModeFIleAttenteViewModel>();
    }

    protected override void ConfigureModuleCatalog(IModuleCatalog  moduleCatalog)
    {
        moduleCatalog.AddModule<Bootstrapper>();
    }
}

Мой HomePage.xaml:

<Window x:Class="TestWPF.View.HomePage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:prism="http://prismlibrary.com/"
    prism:ViewModelLocator.AutoWireViewModel="True"
    mc:Ignorable="d"
    Title="HomePage" Height="347.667" Width="664">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="277*"/>
        <ColumnDefinition Width="16*"/>
    </Grid.ColumnDefinitions>

    <DockPanel Grid.ColumnSpan="2" Margin="0,0,0.333,-0.333">
        <Button Padding="0" DockPanel.Dock="Left" Content="Mode normal" Command="{Binding ClickCommand}" CommandParameter="ModeFileAttente"/>
        <Button Padding="0" DockPanel.Dock="Right" Content="Mode tournois" HorizontalAlignment="Stretch"/>
    </DockPanel>
    <ContentControl prism:RegionManager.RegionName="ContentRegion" Margin="5"  />
  </Grid>
</Window>

А это модель вида:

class HomePageViewModel : BindableBase, IDialogAware, INotifyPropertyChanged
{   

    #region Private region
    private readonly IRegionManager _regionManager;

    public event Action<IDialogResult> RequestClose;
    #endregion

    public DelegateCommand<string> ClickCommand { get; private set; }



    public string Title => throw new NotImplementedException();

    public HomePageViewModel(IRegionManager regionManager)
    {
        _regionManager = regionManager;
        ClickCommand = new DelegateCommand<string>(ExecuteClickCommand);
    }

    private void ExecuteClickCommand(string path) {
        _regionManager.RequestNavigate("ContentRegion", "FileAttente");
    }

    public bool CanCloseDialog()
    {
        throw new NotImplementedException();
    }

    public void OnDialogClosed()
    {
        throw new NotImplementedException();
    }

    public void OnDialogOpened(IDialogParameters parameters)
    {
        throw new NotImplementedException();
    }
}

Я также получил Bootstrapper класс:

public class Bootstrapper : IModule
{
    public void OnInitialized(IContainerProvider containerProvider)
    {
    }

    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<ModeFileAttente>();
    }
}

Мой шаблон MVVM работает хорошо, но когда я хочу перейти между моей «Домашней страницей» и моим представлением «ModeFileAttente», ничего не происходит, кроме «Система».Объект "на мой взгляд.

Я уже ищу, в чем может быть проблема, но я не нашел того, что решило мою проблему.

Кто-то все еще получал эту ошибку с этой версией призмы?

PS: мои 2 вида находятся в папке «Вид», то же самое для модели вида в папке ViewModel

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Я считаю, что вы должны зарегистрировать представление с регионом при инициализации. попробуйте следующий код

public class Bootstrapper : IModule
{
     public void OnInitialized(IContainerProvider containerProvider)
     {
        _regionManager.RegisterViewWithRegion("RegionName", typeof(View));
        _regionManager.RegisterViewWithRegion("RegionName", typeof(View2));
     }
}

Теперь вы можете использовать

_regionManager.RequestNavigate("RegionName", "View"); 

Или

_regionManager.RequestNavigate("RegionName", "View2"); 

Обновление

Еслимы используем призму, тогда с ней должна быть связана структура внедрения зависимостей, например MEF или Unity для моего проекта. Я использую Prism.Unity.Wpf, если вы используете Unity, тогда вы можете попросить вашего инжектора зависимости внедрить RegionManager с помощьюдобавление конструктора, который будет вставлен с помощью IRegionManager, см. ниже

    readonly IRegionManager _regionManager;
    public Bootstrapper(IRegionManager regionManager)
    {
        _regionManager = regionManager;
    }

Когда вы вводите IRegionManager в конструктор Unity, вы знаете, что все время предоставляете один и тот же экземпляр, поскольку он поддерживается в Unity так что не нужно беспокоиться об использовании того же экземпляра IRegionManager в другом месте.

когда мы используем prism:RegionManager.RegionName="ContentRegion" в XAML, мы фактически держим заполнитель, чтобы сказать Prism, что существует область, которая будет заполнена любым VIEW в какой-то момент, ищите его.

Это мое понимание. Дайте мне знать, если вы найдете это полезным. Спасибо.

0 голосов
/ 08 октября 2019

«FileAttente» должно быть «ModeFileAttente»:

 _regionManager.RequestNavigate("ContentRegion", "ModeFileAttente");

Нет вида «FileAttente», зарегистрированного для навигации.

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