为什么Windows窗体数据绑定想要在父对象上引发通知事件时设置我的嵌套布尔数据绑定属性?

Jea*_*nal 11 .net .net-3.5 winforms

好的,所以这里是我的问题的一些上下文,写成伪C#代码(随意指出任何错误):(你可以直接跳转到堆栈跟踪并稍后阅读上下文.)

public class SomeForm {
    private _model = new ViewModelClass
    public void new() {
        // Normal Winforms init omitted
        ViewModelClassBindingSource.DataSource = _model;
        SomeControl1.SetModel(_model);
    }
}
public class SomeControl {
    private _model = new ViewModelClass

    internal void SetModel(ViewModelClass model) {
        _model = model;
        ViewModelClassBindingSource.DataSource = model;
        ViewModelClassBindingSource.ResetBindings(true);
    }
}

public class ComplexObject : IPropertyChanging, IPropertyChanged {
    public property bool BoolProp {get; set;}
}

public class ViewModelClass : IPropertyChanged {
    property IList<ComplexObject> ComplexObjects {get;}

    property ComplexObject SelectedComplexObject {get; set;}

    property Object SomethingNotNecessarilyRelated {get; set;}

    private void NotifyPropertyChanged(string propName) {
        PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
}
Run Code Online (Sandbox Code Playgroud)

这些类中提到的所有属性都是在Visual Studio 2008 Windows窗体设计器,类SomeForm或类中的数据绑定SomeControl.(ComplexObject.BoolProp两者都是数据绑定).不要犹豫,就上下文提出更多问题.

问题:当我做一些(一群)通知在ViewModelClass类中,有某种下意识的反应,设置ComplexObject.BoolPropfalse,用那种堆栈跟踪:

System.dll!System.ComponentModel.ReflectPropertyDescriptor.SetValue(object component = "Object Exposed in 'SelectedComplexObject'", object value = false) + 0x124 bytes 
System.Windows.Forms.dll!System.Windows.Forms.BindToObject.SetValue(object value) + 0x5d bytes  
System.Windows.Forms.dll!System.Windows.Forms.Binding.PullData(bool reformat, bool force) + 0x15a bytes 
System.Windows.Forms.dll!System.Windows.Forms.BindingManagerBase.PullData(out bool success = true) + 0x6e bytes 
System.Windows.Forms.dll!System.Windows.Forms.BindingSource.ParentCurrencyManager_CurrentItemChanged(object sender = {System.Windows.Forms.CurrencyManager}, System.EventArgs e) + 0x54 bytes   
[Native to Managed Transition]  
[Managed to Native Transition]  
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.OnCurrentItemChanged(System.EventArgs e) + 0x17 bytes 
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.List_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e) + 0x3bc bytes   
System.Windows.Forms.dll!System.Windows.Forms.BindingSource.OnListChanged(System.ComponentModel.ListChangedEventArgs e) + 0x7e bytes    
System.Windows.Forms.dll!System.Windows.Forms.BindingSource.InnerList_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e) + 0x2e bytes 
System.dll!System.ComponentModel.BindingList<System.__Canon>.OnListChanged(System.ComponentModel.ListChangedEventArgs e) + 0x17 bytes   
System.dll!System.ComponentModel.BindingList<MyCompany.ViewModelClass>.Child_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + 0x176 bytes 
[Native to Managed Transition]  
[Managed to Native Transition]  
MyCompany.Gui.exe!MyCompany.ViewModelClass.NotifyPropertyChanged(String propertyName = "SomethingNotNecessarilyRelated") Line 437 + 0x3c bytes  Basic
Run Code Online (Sandbox Code Playgroud)

为什么程序要设置SomeBoolfalse?我怎么能防止这种情况?

Jea*_*nal 0

我已将 single 重构ViewModelClassSomeFormViewModelSomeControlViewModel,并将它们绑定到各自的类。

简单地这样做就使问题消失了。

不过,我仍然希望更好地理解我放置的堆栈跟踪 - 我猜想问题的要点是每个人都BindingSource维护自己对对象所做的更改的信息 - 并且因为他们都对同一个对象进行了更改,他们不再知道发生了什么。