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