public virtual void Bind(T target, object source) { INotifyPropertyChanged propertyChanged = source as INotifyPropertyChanged; if (propertyChanged != null) { ItemsBinder <T> .TargetDictionary targetDictionary = (ItemsBinder <T> .TargetDictionary)null; if (!this._sources.TryGetValue(source, out targetDictionary)) { targetDictionary = new ItemsBinder <T> .TargetDictionary(); this._sources.Add(source, targetDictionary); } ItemsBinder <T> .TargetEventListener targetEventListener = (ItemsBinder <T> .TargetEventListener)null; if (!targetDictionary.TryGetValue(target, out targetEventListener)) { targetEventListener = new ItemsBinder <T> .TargetEventListener(this); targetEventListener.OnEventAction = (Action <ItemsBinder <T>, object, PropertyChangedEventArgs>)((instance, sender, eventArgs) => instance.SourcePropertyChanged(sender, eventArgs)); targetEventListener.OnDetachAction = (Action <WeakEventListener <ItemsBinder <T>, object, PropertyChangedEventArgs> >)(weakEventListener => propertyChanged.PropertyChanged -= new PropertyChangedEventHandler(weakEventListener.OnEvent)); propertyChanged.PropertyChanged += new PropertyChangedEventHandler(((WeakEventListener <ItemsBinder <T>, object, PropertyChangedEventArgs>)targetEventListener).OnEvent); targetDictionary.Add(target, targetEventListener); } } this.CallUpdateTarget(target, source, (string)null); }
private void SourcePropertyChanged(object sender, PropertyChangedEventArgs e) { ItemsBinder <T> .TargetDictionary targetDictionary = (ItemsBinder <T> .TargetDictionary)null; if (!this._sources.TryGetValue(sender, out targetDictionary)) { return; } foreach (T target in targetDictionary.Keys) { this.CallUpdateTarget(target, sender, e.PropertyName); } }
public virtual void Unbind(T target, object source) { ItemsBinder <T> .TargetDictionary targetDictionary = (ItemsBinder <T> .TargetDictionary)null; if (!this._sources.TryGetValue(source, out targetDictionary)) { return; } ItemsBinder <T> .TargetEventListener targetEventListener = (ItemsBinder <T> .TargetEventListener)null; if (targetDictionary.TryGetValue(target, out targetEventListener)) { targetEventListener.Detach(); targetDictionary.Remove(target); } if (targetDictionary.Count != 0) { return; } this._sources.Remove(source); }
public TargetEventListener(ItemsBinder <T> binder) : base(binder) { }