Esempio n. 1
0
        /// <summary>
        /// Called when the <c>DataContext</c> property of the <see cref="TargetView" /> has changed.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        public virtual void OnTargetViewDataContextChanged(object sender, DataContextChangedEventArgs e)
        {
            if (IsCurrentDataContext(e))
            {
                return;
            }

            Log.Debug($"DataContext of TargetView '{TargetViewType?.Name}' has changed to '{ObjectToStringHelper.ToTypeString(TargetView.DataContext)}'");

            LastKnownDataContext = null;

            var dataContext = TargetView.DataContext;

            if (ReferenceEquals(dataContext, null))
            {
                return;
            }

            if (dataContext.IsSentinelBindingObject())
            {
                return;
            }

            // Here we have a data context that makes sense
            LastKnownDataContext = new WeakReference(dataContext);

            if (ReferenceEquals(ViewModel, dataContext))
            {
                return;
            }

            // Check if the VM is compatible
            if (_viewModelLocator.IsCompatible(TargetViewType, dataContext.GetType()))
            {
                // Use the view model from the data context, probably set manually
                ViewModel = (IViewModel)dataContext;
            }
        }