В регионах уже зарегистрированы ошибки при навигации - PullRequest
2 голосов
/ 27 декабря 2011

У меня есть область TabControl в Shell.xaml:

<TabControl Name="TabRegionControl" prism:RegionManager.RegionName="TabRegion" />

Пользователь может нажать кнопку, чтобы открыть новую вкладку, которая вызывает:

RegionManager.RequestNavigate("TabRegion", new Uri("Search?X=1", UriKind.Relative));

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

Я знаю, что это происходит, потому что регионы не могут быть снова зарегистрированы в одном и том же диспетчере регионов.Я читал, что области действия могут быть использованы для решения этой проблемы.Как можно лучше понять, я заменяю RequestNavigate выше на это, чтобы создать RegionManager с областью видимости:

SearchViewModel svm = new SearchViewModel();
IRegion detailsRegion = _regionManager.Regions["TabRegion"];
SearchView view = new SearchView(svm);
IRegionManager scopedRegionManager = detailsRegion.Add(view, null, true);
svm.ScopedRegionManager = scopedRegionManager;
svm.LoadViews();

Я считаю, что мне нужно вручную загружать представления в мои подрегионы в методе LoadViews (),но субрегионы не отображаются.

Вот как они определены в Search.xaml:

<ContentControl Background="White" Grid.Row="0"  Grid.Column="0"        
Regions:RegionManager.RegionName="SubRegion1"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"  />

В качестве отправной точки scopedRegionManager, похоже, не имеет ни одного из моих субрегионов в своей коллекции регионов.

edit

Теперь я вижу субрегионы в коллекции регионов менеджера областей с областью действия.Подвиды все еще не отображаются, вот как я пытаюсь загрузить подвиды внутри метода LoadViews, который может быть совершенно не в курсе:

ViewModelSub1 vm = new ViewModelSub1();
IRegion detailsRegion = _regionManager.Regions["RegionSub1"];
SubView1 sView = new SubView1(vm);
IRegionManager detailsRegionManager = detailsRegion.Add(sView, null, false);
detailsRegion.Activate(wsView);

Я новичок в WPF и MVVM.Любая помощь или указатели в правильном направлении будут с благодарностью, так как я совершенно потерян.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 31 августа 2012

У нас была та же проблема, и мы пытались использовать менеджер области с областью действия - безуспешно. Таким образом, мы закончили тем, что сделали решение грубой силы, которое работает, но, вероятно, не по назначению;

public void OnNavigatedFrom(NavigationContext navigationContext)
{
    navigationContext.NavigationService.Region.RegionManager.Regions.Remove("regionname");
}

То есть; при переходе от модели вида / вида, содержащей область «область действия», мы просто удаляем регион из менеджера региона. Когда представление будет создано в следующий раз, оно добавит регион в менеджер регионов без каких-либо исключений.

2 голосов
/ 27 декабря 2011

Мне нравится использовать платформу Prism, однако я считаю, что их Области следует использовать только для макета приложения (MenuRegion, NavigationRegion, ContentRegion и т. Д.), А не для навигации.Использование их для навигации означает, что View позволяет управлять потоком приложений, и я чувствую, что это работа для ViewModels.

Чтобы создать что-то, как вы обрисовали, у меня обычно есть родительская ViewModel, которая содержит

  • ObservableCollection<ITabViewModel> Tabs
  • int SelectedTabIndex
  • ICommand AddNewTabCommand

Мое определение TabControl выглядит следующим образом:

<TabControl ItemsSource="{Binding Tabs}" SelectedIndex="{Binding SelectedTabIndex}" />

а команда AddNewTab просто добавляет новый объект в коллекцию Tabs и задает его как Выбранный

void AddNewTab()
{
    var newTab = new TabAViewModel();
    Tabs.Add(newTab);
    SelectedTabIndex = Tabs.IndexOf(newTab);
}

Чтобы определить, какое представление отображать, я обычно использую DataTemplates

<DataTemplate TargetType="{x:Type local:TabAViewModel}">
    <local:TabAView />
</DataTemplate>

<DataTemplate TargetType="{x:Type local:TabBViewModel}">
    <local:TabBView />
</DataTemplate>
...