protected void UpdateChildBinding() { if (_currentChildBinding != null) { _currentChildBinding.Changed -= ChildSourceBindingChanged; _currentChildBinding.Dispose(); _currentChildBinding = null; } if (PropertyInfo == null) { return; } var currentValue = PropertyInfo.GetValue(Source, PropertyIndexParameters()); if (currentValue == null) { // value will be missing... so end consumer will need to use fallback values } else { _currentChildBinding = SourceBindingFactory.CreateBinding(currentValue, _childTokens); _currentChildBinding.Changed += ChildSourceBindingChanged; } }
private void ClearPathSourceBinding() { if (_sourceBinding != null) { _sourceBinding.Changed -= SourceBindingOnChanged; _sourceBinding.Dispose(); _sourceBinding = null; } }
//TODO: optim: dont recreate the source binding on each datacontext change, as SourcePropertyPath does not change. //TODO: optim: don't subscribe to the Changed event if the binding mode does not need it. protected override void OnDataContextChanged() { ClearPathSourceBinding(); _sourceBinding = SourceBindingFactory.CreateBinding(DataContext, Description.SourcePropertyPath); if (_sourceBinding != null) { _sourceBinding.Changed += SourceBindingOnChanged; } base.OnDataContextChanged(); }
protected override void Dispose(bool isDisposing) { if (isDisposing) { if (_currentChildBinding != null) { _currentChildBinding.Changed -= ChildSourceBindingChanged; _currentChildBinding.Dispose(); _currentChildBinding = null; } } base.Dispose(isDisposing); }
public bool TryCreateBinding(object source, PropertyToken currentToken, List <PropertyToken> remainingTokens, out ISourceBinding result) { if (source == null) { result = null; return(false); } result = remainingTokens.Count == 0 ? CreateLeafBinding(source, currentToken) : CreateChainedBinding(source, currentToken, remainingTokens); return(result != null); }
protected bool TryCreateBindingFromExtensions(object source, PropertyToken propertyToken, List <PropertyToken> remainingTokens, out ISourceBinding result) { foreach (var extension in _extensions) { if (extension.TryCreateBinding(source, propertyToken, remainingTokens, out result)) { return(true); } } result = null; return(false); }