Как очистить представления внутри TabControl, когда родительское представление выгружено? - PullRequest
1 голос
/ 10 ноября 2011

У меня есть представление (я назову его MainView), которое содержит TabControl. Представления, составляющие TabItems, создаются с использованием призмы discovery в ViewModel MainView. Каждое из представлений, которые являются «вкладками», имеет некоторую очистку, которую необходимо выполнить (отсоединить обработчики событий и т. Д.), Когда я закончу с элементом управления вкладками (то есть во время события Unloaded в MainView). Однако я не могу выполнить очистку с помощью события Unloaded представлений вкладок, так как оно вызывается только при переключении вкладок.

MainView вызывает метод в своей ViewModel, когда Unloaded срабатывает, но эта ViewModel не имеет ссылки на Views или ViewModel, которые составляют вкладки из-за способа регистрации этих представлений. Как правильно выполнить очистку после моих «обнаруженных» просмотров вкладок?

Ответы [ 3 ]

1 голос
/ 06 января 2012

В итоге мы использовали сообщение через EventAggregator для очистки подвидов.

1 голос
/ 17 ноября 2011

У меня похожая ситуация, но мы используем элемент управления Dock, где представления загружаются с использованием Prism. Итак, в коде Shell Views, стоящем за unloaded событием, мы перебираем открытые Views и получаем ViewModel для каждого представления. Все наши ViewModel наследуют от базовой ViewModel, которая имеет виртуальный метод CanClose bool, который возвращает, может ли представление закрыться или нет. Базовая ViewModel просто возвращает true. Этот метод используется для проверки наличия ошибок проверки, несохраненных изменений и т. Д. Итак, тогда вы переопределите этот метод и выполните очистку, о которой вы говорили. Если все представления возвращают true, то вы можете вызвать выгрузку модели представления основной оболочки, если нет, то вы можете отменить выгрузку основного представления.

foreach (var doc in dockManager.Documents)
{
    if (!doc.CanClose())
    {
        e.Cancel = true;
        return;
    }
}
0 голосов
/ 21 июня 2017

Я использую навигацию Prism в своем приложении и столкнулся с той же проблемой. Чтобы решить эту проблему, в модели родительского представления в методе OnNavigatedFrom я закрываю все представления в области TabControl:

public class ParentViewModel : INavigationAware
{
    ...
    public void OnNavigatedFrom(NavigationContext navigationContext)
            {
        var region = RegionManager.Regions["TabsRegion"];
        foreach (var view in region.Views)
            region.Remove(view);
    }
}
...