コード例 #1
0
        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);
                            }
                        }
                    }
                }
            };
        }
コード例 #2
0
        private DependentViewInfo GetDependentView(DependentViewAttribute attribute)
        {
            var info = new DependentViewInfo
            {
                TargetRegionName = attribute.TargetRegionName,
                View             = attribute.ViewType != null?_containerProvider.Resolve(attribute.ViewType) : null
            };

            return(info);
        }