예제 #1
0
        public override object?ProvideValue(IServiceProvider serviceProvider)
        {
            var rootObjectProvider = (IRootObjectProvider)serviceProvider.GetService(typeof(IRootObjectProvider));

            if (rootObjectProvider == null)
            {
                VisualComposition.OnError(this, $"Import: Service {nameof(IRootObjectProvider)} unavailable.");
                return(null);
            }

            var rootObject = rootObjectProvider.RootObject as FrameworkElement ?? Application.Current.MainWindow;

            if (rootObject == null)
            {
                return(null);
            }

            if (DesignerProperties.GetIsInDesignMode(rootObject))
            {
                return(null);
            }

            if (AllowRecomposition)
            {
                var provideValueTarget = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
                if (provideValueTarget != null)
                {
                    _targetObject   = provideValueTarget.TargetObject;
                    _targetProperty = provideValueTarget.TargetProperty;
                }

                _tracker = rootObject.Track(ExportProviderLocator.ExportProviderProperty);

                rootObject.Loaded   += RootObject_Loaded;
                rootObject.Unloaded += RootObject_Unloaded;
            }
            else
            {
                _exportProvider = rootObject.GetExportProvider();
            }

            return(Value);
        }
예제 #2
0
        /// <inheritdoc />
        /// <summary>
        /// Updates this instance.
        /// </summary>
        protected override void OnUpdate()
        {
            var regionId     = RegionId;
            var itemsControl = AssociatedObject;
            var selector     = itemsControl as Selector;

            VisualComposition.OnTrace(this, $"Update {GetType()}, RegionId={regionId}, ItemsControl={itemsControl}");

            if (itemsControl == null)
            {
                return;
            }

            if (string.IsNullOrEmpty(regionId))
            {
                itemsControl.ItemsSource = null;
                return;
            }

            var exports = GetExports(regionId);

            if (exports == null)
            {
                VisualComposition.OnTrace(this, $"Update {GetType()}: No exports for RegionId={regionId} found");
                return;
            }

            var exportedItems = exports
                                .OrderBy(item => item.Metadata?.Sequence)
                                .Select(item => GetTarget(item.Value))
                                .ToArray();

            VisualComposition.OnTrace(this, $"Update {GetType()}, Found {exportedItems.Length} items");

            var currentItems = itemsControl.Items.Cast <object>().ToArray();

            if (exportedItems.SequenceEqual(currentItems))
            {
                ApplyContext(currentItems, CompositionContext);
                return;
            }

            if (selector != null)
            {
                selector.SelectionChanged -= Selector_SelectionChanged;
                DetachSelectables(currentItems);
            }

            ApplyContext(currentItems.Except(exportedItems), null);

            itemsControl.ItemsSource = exportedItems;

            ApplyContext(exportedItems, CompositionContext);

            if (selector != null)
            {
                AttachSelectables(exportedItems);
                selector.SelectionChanged += Selector_SelectionChanged;

                if (ForceSelection && (selector.SelectedIndex == -1) && !selector.Items.IsEmpty)
                {
                    selector.SelectedIndex = 0;
                }
            }
        }