Mamy napotkasz problem gdzieCo jest innego podczas uzyskiwania dostępu do BindingContext [dataSource] vs BindingContext [dataSource, dataMember]?
- mamy dwie instancje tego samego okna w obszarze roboczym MDI związanej z dwóch oddzielnych modeli obiektowych.
- Modele obiektów mają zastąpione metody i
.GetHashCode
, aby można je było uznać za równe. - Wywołanie
.EndCurrentEdit()
na okno 2 jest wyzwalanie aktualizacji wiązania na oknie 1 - Oba okna są ustawione w użyciu oddzielnego
BindingContext
Odkryliśmy problem ma związek z wywołaniem
((PropertyManager)ctrl.BindingContext[dataSource]).EndCurrentEdit();
Jeśli zmienimy to na
((PropertyManager)ctrl.BindingContext[dataSource, dataMember]).EndCurrentEdit();
Działa poprawnie. Działa również poprawnie, jeśli usuniemy nasze nadpisania .Equals
i .GetHashCode
, aby dwa modele obiektów nie były już uznawane za równe.
To nie ma dla mnie sensu, ponieważ okna są takie same, więc właściwość dataMember
również byłaby taka sama.
Od this link, uważam, że definicja tych połączeń jest:
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);
}
My dataSource
nie jest ICurrencyManagerProvider
Jaka jest różnica między tymi dwoma połączeniami, i dlaczego dostępu do PropertyManager
przez tylko dataSource
powoduje powiązanie dla innego okna z aktualizacją osobnego BindingContext
?
To wstyd, że nikt nie rozważył tej kwestii, uważam, że to pytanie jest intrygujące. – DonBoitnott