/// <inheritdoc />
        public async Task <bool> ComposeAsync(IViewCompositionContext context)
        {
            try
            {
                DataContextLoadedCompletion = new TaskCompletionSource <object>();
                SetCoordinationArguments(context.Control, context.CoordinationArguments);

                Log.Debug($"Composition is being configured.");
                Configure(context);

                Log.Debug($"Attaching DataContextChanged and Unload events.");
                context.Control.DataContextChanged -= DataContextChanged;
                context.Control.DataContextChanged += DataContextChanged;

                // memory leak countermeasure
                context.Control.Unloaded += ControlOnUnloaded;

                Log.Debug($"Finalizing composition.");
                await FinalizeCompositionAsync(context);

                await BehaviorRunner.ExecuteAsync(context.DataContext as IBehaviorHost, new ViewComposedBehaviorContext(context, ServiceContext));

                await DataContextLoadedCompletion.Task;

                return(true);
            }
            catch (Exception e)
            {
                Log.Error(e);
                return(false);
            }
        }
        /// <inheritdoc />
        public bool TryBind(IViewCompositionContext context)
        {
            if (context.Control is TransitioningContentControl control)
            {
                if (context.DataContext is IViewTransition transition)
                {
                    if (Enum.TryParse(transition.GetTransition().ToString(), out TransitionType parsed))
                    {
                        control.Transition = parsed;
                    }
                    else
                    {
                        control.Transition = TransitionType.Up;
                    }
                }
                else
                {
                    control.Transition = TransitionType.Up;
                }

                control.Content = context.DataContext;
                return(true);
            }

            return(false);
        }
        /// <inheritdoc />
        protected override void Configure(IViewCompositionContext context)
        {
            if (context.Control is Window window)
            {
                if (context.DataContext is IWindowViewModel windowViewModel)
                {
                    window.SizeToContent = windowViewModel.SizeToContent;
                    window.ShowInTaskbar = windowViewModel.ShowInTaskbar;

                    windowViewModel.WhenFocusRequested.Subscribe(o => window.Focus());
                    windowViewModel.WhenClosingRequested.Subscribe(o => window.Close());
                    windowViewModel.WhenMinimizeRequested.Subscribe(o => window.WindowState  = WindowState.Minimized);
                    windowViewModel.WhenMaximizeRequested.Subscribe(o => window.WindowState  = WindowState.Maximized);
                    windowViewModel.WhenNormalizeRequested.Subscribe(o => window.WindowState = WindowState.Normal);

                    window.WhenClosing().Subscribe(args =>
                    {
                        if (windowViewModel is IWindowListener listener)
                        {
                            listener.NotifyClosing(args);
                        }
                    });

                    window.WhenStateChanged().Throttle(TimeSpan.FromMilliseconds(50)).Subscribe(args =>
                    {
                        if (windowViewModel is IWindowListener listener)
                        {
                            listener.NotifyWindowStateChange(args);
                        }
                    });

                    window.WhenLocationChanged().Throttle(TimeSpan.FromMilliseconds(50)).Subscribe(args =>
                    {
                        if (windowViewModel is IWindowListener listener)
                        {
                            listener.NotifyLocationChanged(args);
                        }
                    });

                    window.WhenSizeChanged().Throttle(TimeSpan.FromMilliseconds(50)).Subscribe(args =>
                    {
                        if (windowViewModel is IWindowListener listener)
                        {
                            listener.NotifySizeChanged(args);
                        }
                    });

                    window.WhenClosed().Subscribe(async(args) =>
                    {
                        if (windowViewModel is IWindowListener listener)
                        {
                            listener.NotifyClosed();
                        }

                        await BehaviorRunner.ExecuteAsync(windowViewModel as IBehaviorHost, new WindowClosedContext(windowViewModel, ServiceContext.ServiceProvider, context));
                    });
                }
            }
        }
        /// <param name="context"></param>
        /// <inheritdoc />
        protected override Task FinalizeCompositionAsync(IViewCompositionContext context)
        {
            if (context.Control is Window window)
            {
                context.Control.DataContext = context.DataContext;

                if (context.DataContext is IWindowViewModel windowViewModel && windowViewModel.Content.ClaimMainWindowOnOpen)
                {
                    Application.Current.MainWindow = window;
                }

                window.Show();
            }

            return(Task.CompletedTask);
        }
        /// <param name="context"></param>
        /// <inheritdoc />
        protected override Task FinalizeCompositionAsync(IViewCompositionContext context)
        {
            if (context.Control is ContentPresenter contentPresenter)
            {
                contentPresenter.Content = context.DataContext;
            }
            else
            {
                context.Control.DataContext = context.DataContext;
            }

            foreach (var binder in ViewContextBinder)
            {
                if (binder.TryBind(context))
                {
                    Log.Debug($"ViewBinder {binder.GetType().FullName} is handling {context}.");
                }
            }

            return(Task.CompletedTask);
        }
 protected abstract Task FinalizeCompositionAsync(IViewCompositionContext context);
 protected abstract void Configure(IViewCompositionContext context);
 protected virtual void DataContextLoaded(IViewCompositionContext context)
 {
 }
 public ViewComposedBehaviorContext([NotNull] IViewCompositionContext compositionContext, [NotNull] IServiceContext serviceContext)
 {
     CompositionContext = compositionContext ?? throw new ArgumentNullException(nameof(compositionContext));
     ServiceContext     = serviceContext ?? throw new ArgumentNullException(nameof(serviceContext));
 }
 /// <inheritdoc />
 protected override void Configure(IViewCompositionContext context)
 {
 }
Ejemplo n.º 11
0
 /// <inheritdoc />
 public WindowClosedContext([NotNull] object viewModel, [NotNull] IServiceProvider serviceProvider, [NotNull] IViewCompositionContext context)
 {
     ViewModel       = viewModel ?? throw new ArgumentNullException(nameof(viewModel));
     ServiceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
     Context         = context ?? throw new ArgumentNullException(nameof(context));
 }