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); }
/// <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; } } }