Регион призмы не меняется в области контента - WPF - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь изучить Prism и использовать его в новом приложении, над которым я работаю, но застрял при попытке заставить его переключать контент в навигации.Для справки, видео, над которым я работал / учился, было видео Брайана Лагунаса MVVM Made Simple на YouTube (я просматривал этот раздел несколько раз, но не могу понять, что я делаю неправильно).Вот код моего главного окна (когда я добавил строку regionManager.RegisterViewWithRegion(), это позволило первому зарегистрированному представлению отображаться при запуске, но все равно не позволит мне переключаться с одного вида на другой.

public partial class MainWindow : Window
{
    protected RegionManager regionManager = new RegionManager();

    public MainWindow()
    { 
        InitializeComponent();

        regionManager.RegisterViewWithRegion("Content", typeof(Index));
        regionManager.RegisterViewWithRegion("Content", typeof(Home));

        DataContext = new MainWindowViewModel(this, regionManager);

Это весь код и операторы призмы xmlns (они находятся вверху всех моих представлений), которые я связал с менеджером региона / региона - я протестировал привязку Команды на кнопке и знаю, что методзапускается, поэтому кнопки должны быть хорошими - но во всем остальном я не уверен, но для видео это выглядит правильно для меня.

XMLNS-заявления

xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"

Область содержимого в XAML

<!-- Page Content -->
<Border Grid.Row="3" Padding="{Binding WindowContentPadding}">
    <ContentControl prism:RegionManager.RegionName="Content" />
</Border>

Bootstrapper

class Bootstrapper : UnityBootstrapper
{
    protected override DependencyObject CreateShell()
    {
        return Container.Resolve<MainWindow>();
    }

    protected override void InitializeShell()
    {
        Application.Current.MainWindow.Show();
    }

    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();

        // Registering Unity containers for view model navigation
        // All views must be registered.
        Container.RegisterType(typeof(object), typeof(Home), "Home");
        Container.RegisterType(typeof(object), typeof(Index), "Index");

    }
}

MainWindowViewModel

public DelegateCommand<string> NavigateCommand { get; set; }

public MainWindowViewModel(Window _window, RegionManager _regionManager)
{
    window = _window;

    // MVVM model locator code
    regionManager = _regionManager;

    NavigateCommand = new DelegateCommand<string>(Navigate);
}

private void Navigate(string uri)
{
    //Test
    Console.WriteLine(uri);
    regionManager.RequestNavigate("Content", uri);
}

Я также проверил его курс MVVM Pluralsight, и инструкции там также выглядят одинаково, так что, насколько я могу судить, это должно быть что-то, чего мне не хватает.

1 Ответ

0 голосов
/ 08 октября 2018
protected RegionManager regionManager = new RegionManager();

Вы также не хотите создавать свои собственные RegionManager и не хотите делать это в представлении.

Выполните навигацию в модели представления и получитедобавлен менеджер области.

public MainWindowViewModel(Window _window, RegionManager _regionManager)

Вы не хотите иметь представление внутри модели представления, и оно вам все равно не нужно.

Иметь представлениевзаимодействовать с моделью представления только через привязки.

У меня есть два вида (viewA и viewB) и две кнопки, которые должны переключаться между двумя видами

Затем сделайте одну кнопкувыполнить _regionManager.RequestNavigate( "Content", "viewA" ), а другой _regionManager.RequestNavigate( "Content", "viewB" ).Представления должны быть зарегистрированы следующим образом _container.RegisterTypeForNavigation<viewA>( "viewA" ).

Вы не хотите использовать RegisterViewWithRegion здесь, просто перейдите к ViewA, когда приложение завершит инициализацию.

...