Prism: IRegionMemberLifetime не работает в некоторых сценариях - PullRequest
2 голосов
/ 28 мая 2011

Я пытаюсь создать приложение Silverlight, используя Prism 4, и я проверяю его возможности навигации. Я хочу переключаться между двумя видами, когда нажимаю на кнопку. Первый вид:

public partial class HomeView
{
    public HomeView(HomeViewModel viewModel)
    {
        DataContext = viewModel;

        InitializeComponent();
    }
}

и ViewModel:

public class HomeViewModel : NotificationObject, IRegionMemberLifetime
{
    private readonly IRegionManager _regionManager;

    public DelegateCommand SubmitCommand { get; set; }
    public bool KeepAlive { get { return false; } }

    public HomeViewModel(IRegionManager regionManager)
    {
        _regionManager = regionManager;
        SubmitCommand = new DelegateCommand(Submit);
    }

    private void Submit()
    {
        _regionManager.RequestNavigate("Home", new Uri(typeof(UsersView).Name, UriKind.Relative));
    }
}

Проблема в том, что когда я устанавливаю область «Домой» в ItemsControl, Grid (с адаптером) - он не входит в свойство KeepAlive, а просто добавляет второе представление в регион, и я вижу их обоих .

Когда регион определен как ContentControl или TabControl - он удаляет HomeView и добавляет UsersView!

Может кто-нибудь сказать мне, что я делаю не так? Я хочу использовать сетку в качестве региона для достижения этого.

Я прочитал эту главу http://msdn.microsoft.com/en-us/library/gg430861%28v=pandp.40%29.aspx и не нашел ответа ...

1 Ответ

0 голосов
/ 20 сентября 2011

У вас есть два типа используемых элементов управления:

ContentControl и TabControl будут использовать адаптер области, используя SingleActiveRegion.По сути, за один раз может отображаться только одно представление.

Вероятно, оба Grid и ItemsControl - это AllActiveRegion (ItemsControl определенно не знает о вашем GridAdapter), что означает, что они могут отображать несколько представлений одновременно.

Глядя на NavigationService, который использует Регион для перехода от представления X к представлению Y, вот что происходит:

  1. Уведомляет активное представление о том, что это недольше активен.

  2. Загружает новый вид.Если он уже есть (и представление реализует IActiveAware), он будет реактивирован.В противном случае он создает новый экземпляр представления

  3. Запускает событие навигации

  4. Информирует представление «y», к которому он перемещается.Опять же, представление должно реализовывать IActiveAware

  5. Повышает NavigatedEvent.

Итак:

Ваши представления реализуют IActiveAware?

Что еще более важно, если вы используете контейнер, который может отображать несколько представлений одновременно (ItemsControl и т. Д.), То я думаю, что вам нужно будет вручную удалить представление из области, потому что Prism не собирается делатьэто для вас!

Вы можете сделать это довольно легко.Вы можете написать свой собственный класс, который реализует INavigationService, а затем вставить его в свойство NavigationService региона.Это дает вам контроль над тем, что делает навигационная служба.

Надеюсь, это поможет.

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