我們遇到了一個problem,其中當訪問BindingContext [dataSource] vs BindingContext [dataSource,dataMember]時有什麼不同?
- 我們擁有同一個窗口的兩個實例綁定到兩個不同的對象模型的MDI工作區。
- 對象模型的
.Equals
和.GetHashCode
方法被覆蓋爲等同。 - 上調用窗口2
.EndCurrentEdit()
被觸發綁定更新窗口1 - 兩個窗口都設置爲使用單獨一個
BindingContext
我們已經發現的問題與調用
((PropertyManager)ctrl.BindingContext[dataSource]).EndCurrentEdit();
做
如果我們將其更改爲
((PropertyManager)ctrl.BindingContext[dataSource, dataMember]).EndCurrentEdit();
它工作正常。如果我們刪除我們的.Equals
和.GetHashCode
覆蓋,這兩個對象模型不再被認爲是相等的,它也能正常工作。
這對我來說沒有意義,因爲窗口是相同的,所以dataMember
屬性也是一樣的。
從this link,我相信這些電話的定義是:
public BindingManagerBase this[object dataSource] {
get {
return this[dataSource, ""];
}
}
public BindingManagerBase this[object dataSource, string dataMember] {
get {
return EnsureListManager(dataSource, dataMember);
}
internal BindingManagerBase EnsureListManager(object dataSource, string dataMember) {
BindingManagerBase bindingManagerBase = null;
if (dataMember == null)
dataMember = "";
// Check whether data source wants to provide its own binding managers
// (but fall through to old logic if it fails to provide us with one)
//
if (dataSource is ICurrencyManagerProvider) {
bindingManagerBase = (dataSource as ICurrencyManagerProvider).GetRelatedCurrencyManager(dataMember);
if (bindingManagerBase != null) {
return bindingManagerBase;
}
}
// Check for previously created binding manager
//
HashKey key = GetKey(dataSource, dataMember);
WeakReference wRef;
wRef = listManagers[key] as WeakReference;
if (wRef != null)
bindingManagerBase = (BindingManagerBase) wRef.Target;
if (bindingManagerBase != null) {
return bindingManagerBase;
}
if (dataMember.Length == 0) {
// No data member specified, so create binding manager directly on the data source
//
if (dataSource is IList || dataSource is IListSource) {
// IListSource so we can bind the dataGrid to a table and a dataSet
bindingManagerBase = new CurrencyManager(dataSource);
}
else {
// Otherwise assume simple property binding
bindingManagerBase = new PropertyManager(dataSource);
}
}
else {
// Data member specified, so get data source's binding manager, and hook a 'related' binding manager to it
//
int lastDot = dataMember.LastIndexOf(".");
string dataPath = (lastDot == -1) ? "" : dataMember.Substring(0, lastDot);
string dataField = dataMember.Substring(lastDot + 1);
BindingManagerBase formerManager = EnsureListManager(dataSource, dataPath);
PropertyDescriptor prop = formerManager.GetItemProperties().Find(dataField, true);
if (prop == null)
throw new ArgumentException(SR.GetString(SR.RelatedListManagerChild, dataField));
if (typeof(IList).IsAssignableFrom(prop.PropertyType))
bindingManagerBase = new RelatedCurrencyManager(formerManager, dataField);
else
bindingManagerBase = new RelatedPropertyManager(formerManager, dataField);
}
我dataSource
不是ICurrencyManagerProvider
是這兩個調用之間的區別,以及爲什麼只訪問PropertyManager
dataSource
導致另一個窗口的綁定正在更新,並且單獨的BindingContext
?
在這個問題上沒有人認爲這是一個恥辱,我覺得這個問題很有趣。 – DonBoitnott