public class BindingContext : ICollection, IEnumerable {
private Hashtable managers;
+ private object null_data_source = new object ();
- private class ManagerEntry {
+ private class DataSourceEntry {
private object source;
- private WeakReference member_ref;
+ private Hashtable members;
+ // private BindingManagerBase default_manager;
- private int member_hash;
-
- public ManagerEntry (object source, string member)
+ public DataSourceEntry (object source)
{
this.source = source;
- if (member == null)
- member = String.Empty;
-
- member_hash = member.ToLower (CultureInfo.InvariantCulture).GetHashCode ();
- if (member_hash == 0)
- member_hash = 1;
- member_ref = new WeakReference (member, false);
+ members = new Hashtable ();
}
- public override bool Equals (object b)
+ public BindingManagerBase AddMember (string member)
{
- ManagerEntry o = (ManagerEntry) b;
-
- return (o.source == source && o.member_ref.Target == member_ref.Target);
+ if (member == null)
+ member = String.Empty;
+ BindingManagerBase res = members [member] as BindingManagerBase;
+ if (res != null)
+ return res;
+ res = CreateBindingManager (source, member);
+ members [member] = res;
+ return res;
}
- public override int GetHashCode ()
+ public void AddMember (string member, BindingManagerBase manager)
{
- return member_hash * source.GetHashCode ();
+ members [member] = manager;
}
- public override string ToString ()
+ public bool Contains (string member)
{
- return source.ToString () + " + " + (member_ref.Target == null ? " -- null --" : member_ref.Target.ToString ());
+ return members.Contains (member);
}
}
public BindingManagerBase this [object data_source, string data_member] {
get {
- ManagerEntry e = CreateEntry (data_source, data_member);
- WeakReference wref = managers [e] as WeakReference;
-
- if (wref != null && wref.Target != null)
- return wref.Target as BindingManagerBase;
- BindingManagerBase res = AddManager (data_source, data_member);
- return res;
+ DataSourceEntry ds = GetEntry (data_source, data_member, true);
+ return ds.AddMember (data_member);
}
}
- private BindingManagerBase AddManager (object data_source, string data_member)
+ private DataSourceEntry GetEntry (object data_source, string data_member, bool create)
{
- BindingManagerBase res = CreateBindingManager (data_source, data_member);
- managers [CreateEntry (data_source, data_member)] = new WeakReference (res);
+ if (data_source == null)
+ data_source = null_data_source;
+
+ DataSourceEntry ds = managers [data_source] as DataSourceEntry;
+ if (ds == null && create) {
+ ds = new DataSourceEntry (data_source);
+ managers [data_source] = ds;
+ }
- return res;
+ return ds;
}
- private BindingManagerBase CreateBindingManager (object data_source,
+ private static BindingManagerBase CreateBindingManager (object data_source,
string data_member)
{
if (data_source is IList ||
data_source is IListSource ||
data_source is IBindingList) {
- CurrencyManager res = new CurrencyManager (data_source);
+ CurrencyManager res = new CurrencyManager (data_source, data_member);
return res;
}
public bool Contains (object dataSource, string dataMember)
{
- ManagerEntry entry = CreateEntry (dataSource, dataMember);
+ DataSourceEntry ds = GetEntry (dataSource, dataMember, false);
+ if (ds == null)
+ return false;
+ return ds.Contains (dataMember);
- return managers.ContainsKey (entry);
}
#endregion // Public Instance Methods
throw new ArgumentNullException ("dataSource");
if (listManager == null)
throw new ArgumentNullException ("listManager");
- managers.Add (CreateEntry (dataSource, String.Empty), new WeakReference (listManager));
+ DataSourceEntry ds = GetEntry (dataSource, String.Empty, true);
+ ds.AddMember (String.Empty, listManager);
}
protected internal void Clear ()
protected virtual void RemoveCore (object dataSource)
{
- managers.Remove (CreateEntry (dataSource, String.Empty));
+ managers.Remove (dataSource);
}
#endregion // Protected Instance Methods
throw new NotImplementedException();
}
#endregion // IEnumerable Interfaces
-
- private ManagerEntry CreateEntry (object dataSource, string dataMember)
- {
- return new ManagerEntry (dataSource, dataMember);
- }
}
}