예제 #1
0
        protected virtual void OnBeforeNewViewModelAdded(object newDataContext, IHostAwareViewModel newViewModel)
        { 

        }
예제 #2
0
        void OnBeforeNewViewModelAddedInternal(object newDataContext, IHostAwareViewModel newViewModel)
        {
            if(newViewModel != null)
            {
                if (SUBSCRIPTION_AfterViewModelRaised != null)
                    SUBSCRIPTION_AfterViewModelRaised.Dispose();

                SUBSCRIPTION_AfterViewModelRaised =
                (newViewModel as ViewModel) // todo: update IViewModel interface
                    .CreateWeakEventHandler()
                    .ForEvent<AfterViewModelEventRaisedArgs>(
                    (vm, h) => vm.AfterViewModelEventRaised += h,
                    (vm, h) => vm.AfterViewModelEventRaised -= h)
                    .Subscribe((vm, args) => OnAfterViewModelEventRaised(vm as ViewModel, args.Event, args.RoutingStrategy));


                if (SUBSCRIPTION_FindDataContextInVisualTree != null)
                    SUBSCRIPTION_FindDataContextInVisualTree.Dispose();

                SUBSCRIPTION_FindDataContextInVisualTree =
                    (newViewModel as ViewModel)
                    .CreateWeakEventHandler()
                    .ForEvent<SquaredInfinity.Foundation.Presentation.ViewModels.ViewModel.FindDataContextInVisualTreeEventArgs>(
                    (vm, h) => vm.TryFindDataContext += h,
                    (vm, h) => vm.TryFindDataContext -= h)
                    .Subscribe((_s, _e) =>
                        {
                            var vp = this.GetVisualOrLogicalParent();

                            while(vp != null)
                            {
                                var fe = vp as FrameworkElement;

                                if(fe != null)
                                {
                                    var dx = fe.DataContext;

                                    if(dx != null)
                                    {
                                        var result = (object) null;

                                        if(dx.TryConvert(_e.DataContextType, out result))
                                        {
                                            _e.DataContext = result;
                                            _e.Handle();
                                            return;
                                        }
                                    }

                                    // if fe is a View, try to convert view model to desired type

                                    var v = fe as View;

                                    if(v != null)
                                    {
                                        var vm = v.ViewModel;

                                        if(vm != null)
                                        {
                                            var result = (object)null;

                                            if(vm.TryConvert(_e.DataContextType, out result))
                                            {
                                                _e.DataContext = result;
                                                _e.Handle();
                                                return;
                                            }
                                        }
                                    }
                                }

                                vp = vp.GetVisualOrLogicalParent();
                            }
                        });
            }

            OnBeforeNewViewModelAdded(newDataContext, newViewModel);
        }
예제 #3
0
 protected virtual void OnBeforeOldViewModelRemoved(object oldDataContext, IHostAwareViewModel oldViewModel)
 { }
예제 #4
0
        void OnBeforeNewViewModelAddedInternal(object newDataContext, IHostAwareViewModel newViewModel)
        {
            if (newViewModel != null)
            {
                AfterViewModelRaisedSubscription =
                (newViewModel as ViewModel) // todo: update IViewModel interface
                    .CreateWeakEventHandler()
                    .ForEvent<AfterViewModelEventRaisedArgs>(
                    (vm, h) => vm.AfterViewModelEventRaised += h,
                    (vm, h) => vm.AfterViewModelEventRaised -= h)
                    .Subscribe((vm, args) => OnAfterViewModelEventRaised(vm as ViewModel, args.Event, args.RoutingStrategy));
            }

            OnBeforeNewViewModelAdded(newDataContext, newViewModel);
        }
        void viewModel_modalInteractionCompleting(IHostAwareViewModel hostAwareViewModel)
        {
            // unsubscribe view model from this event (to prevent memory leak)
            hostAwareViewModel.InteractionCompleting -= viewModel_modalInteractionCompleting;

            // set dialog result on window
            Window window = hostAwareViewModel.ViewModelHost as Window;

            if (window != null && window.DialogResult == null)
            {
                switch (hostAwareViewModel.InteractionOutcome)
                {
                    case UserInteractionOutcome.Cancelled:
                        window.DialogResult = false;
                        break;
                    case UserInteractionOutcome.OtherSuccess:
                        window.DialogResult = true;
                        break;
                    default:
                        window.DialogResult = false;
                        break;
                }
            }
        }
        void viewModel_nonModalInteractionCompleting(IHostAwareViewModel hostAwareViewModel)
        {
            // unsubscribe view model from this event (to prevent memory leak)
            hostAwareViewModel.InteractionCompleting -= viewModel_nonModalInteractionCompleting;

            // set dialog result on window
            Window window = hostAwareViewModel.ViewModelHost as Window;

            if (window != null)
            {
                window.Close();
            }
        }