public override void Dispose()
 {
     _formatExpression = null;
     _getSourceMemberValue = null;
     for (int index = 0; index < _sources.Length; index++)
         _sources[index].Dispose();
     base.Dispose();
 }
 public void SetValue(BindingActionValue currentValue, object newValue)
 {
     //it's normal here.
     lock (this)
     {
         if (_currentValue != null && Equals(currentValue.Member, _currentValue.Member) &&
             Equals(_currentValue.MemberSource.Target, currentValue.MemberSource.Target))
             SetValue(newValue);
         else
         {
             UnsubscribeEventHandler();
             currentValue.TrySetValue(new object[] { this }, out _subscriber);
             if (_subscriber != null)
             {
                 _currentValue = currentValue;
                 SetValue(newValue);
             }
         }
     }
 }
 private void TryRegisterEvent(BindingActionValue bindingActionValue, object newValue, IDataContext context)
 {
     if (newValue == null && _closure == null)
         return;
     if (_closure == null)
         Interlocked.CompareExchange(ref _closure, new EventClosure(ServiceProvider.WeakReferenceFactory(this)), null);
     _closure.LastContext = context;
     _closure.SetValue(bindingActionValue, newValue);
 }
 protected override object GetValueInternal(IBindingMemberInfo targetMember, IDataContext context,
     bool throwOnError)
 {
     if (BindingMemberType.Event.EqualsWithoutNullCheck(targetMember.MemberType))
     {
         if (_getSourceMemberValue == null)
             _getSourceMemberValue = new BindingActionValue(this, BindingMemberInfo.MultiBindingSourceAccessorMember);
         return _getSourceMemberValue;
     }
     return base.GetValueInternal(targetMember, context, throwOnError);
 }
 private void TryRegisterEvent(BindingActionValue bindingActionValue, object newValue, IDataContext context)
 {
     if (newValue == null && _closure == null)
         return;
     if (_closure == null)
         Interlocked.CompareExchange(ref _closure,
             new EventClosure(_bindingSource, _toggleEnabledState && IsTarget,
                 Parameters == null ? null : Parameters.CommandParameterDelegate), null);
     _closure.LastContext = context;
     _closure.SetValue(bindingActionValue, newValue);
 }