/// <inheritdoc />
        public async Task <bool> DisplayAsync(object dataContext, ICoordinationArguments coordinationArguments)
        {
            if (coordinationArguments is RegionArguments arguments)
            {
                var control = RegionManager.GetControl(arguments.RegionManagerReference, arguments.TargetRegion);

                if (control.DataContext is IBehaviorHost interactive)
                {
                    var context = new ContentChangingBehaviorContext(ServiceContext.ServiceProvider, control.DataContext, dataContext);
                    await BehaviorRunner.ExecuteAsync(interactive, context);

                    if (context.Cancelled)
                    {
                        Log.Debug($"Change prevented by {nameof(ContentChangingBehaviorContext)}.");
                        return(false);
                    }
                }

                var composer = ComposerFactory.Create(control);
                if (composer == null)
                {
                    return(false);
                }

                return(await composer.ComposeAsync(new ViewCompositionContext(control, dataContext, coordinationArguments)));
            }

            return(false);
        }
コード例 #2
0
        /// <inheritdoc />
        public async Task <bool> DisplayAsync(object dataContext, ICoordinationArguments coordinationArguments)
        {
            if (dataContext == null)
            {
                throw new ArgumentNullException(nameof(dataContext));
            }
            if (coordinationArguments == null)
            {
                throw new ArgumentNullException(nameof(coordinationArguments));
            }

            if (coordinationArguments is WindowArguments arguments)
            {
                if (!WindowManager.TryGetWindow(arguments.WindowId, out var window))
                {
                    Log.Debug($"Creating window for {dataContext.GetType().FullName} using id [{arguments.WindowId}]");
                    foreach (var windowFactory in WindowFactories)
                    {
                        if (windowFactory.CanCreateWindow(dataContext))
                        {
                            window = windowFactory.CreateWindow(dataContext);
                            WindowManager.RegisterWindow(window, arguments.WindowId);
                        }
                    }

                    if (window == null)
                    {
                        Log.Error($"No factory was able to create a window for {dataContext.GetType().FullName}");
                        return(false);
                    }
                }

                var composer = ComposerFactory.Create(window);
                if (composer == null)
                {
                    return(false);
                }

                if (window.DataContext is IBehaviorHost interactive)
                {
                    var context = new ContentChangingBehaviorContext(ServiceContext.ServiceProvider, window.DataContext, dataContext);
                    await BehaviorRunner.ExecuteAsync(interactive, context);

                    if (context.Cancelled)
                    {
                        Log.Debug($"Change prevented by {nameof(ContentChangingBehaviorContext)}.");
                        return(false);
                    }
                }

                return(await composer.ComposeAsync(new ViewCompositionContext(window, dataContext, coordinationArguments)));
            }

            Log.Error($"Unable to visualize {dataContext} because {nameof(arguments)} is not of type {typeof(WindowArguments).FullName}");
            return(false);
        }