protected override void OnAttach() { Region.ActiveViews.CollectionChanged += (sender, args) => { if (args.Action == NotifyCollectionChangedAction.Add) { foreach (var newView in args.NewItems) { var dependentViews = new List <DependentViewInfo>(); if (_dependentViewsCache.ContainsKey(newView)) { dependentViews = _dependentViewsCache[newView]; } else { var attributes = newView.GetType().GetCustomAttributes <DependentViewAttribute>(); foreach (var attribute in attributes) { var dependentViewInfo = new DependentViewInfo(attribute.Region, _container.Resolve(attribute.Type)); dependentViews.Add(dependentViewInfo); //внедрение в зависимый вид контекста основного вида if (attribute.HasSameDataContext) { if (newView is FrameworkElement mainView && dependentViewInfo.View is FrameworkElement dependentView) { dependentView.DataContext = mainView.DataContext; } } } _dependentViewsCache.Add(newView, dependentViews); } dependentViews.ForEach(x => Region.RegionManager.Regions[x.Region].Add(x.View)); } } else if (args.Action == NotifyCollectionChangedAction.Remove) { foreach (var oldView in args.OldItems) { if (_dependentViewsCache.ContainsKey(oldView)) { var dependentViews = _dependentViewsCache[oldView]; dependentViews.ForEach(x => Region.RegionManager.Regions[x.Region].Remove(x.View)); //если вид нужно удалить if (!ShouldKeepAlive(oldView)) { _dependentViewsCache.Remove(oldView); } } } } }; }
private DependentViewInfo GetDependentView(DependentViewAttribute attribute) { var info = new DependentViewInfo { TargetRegionName = attribute.TargetRegionName, View = attribute.ViewType != null?_containerProvider.Resolve(attribute.ViewType) : null }; return(info); }