gpt4 book ai didi

.net - 当我在父对象上引发通知事件时,为什么 Windows 窗体数据绑定(bind)要设置我的嵌套 bool 数据绑定(bind)属性?

转载 作者:行者123 更新时间:2023-12-03 21:34:43 27 4
gpt4 key购买 nike

好的,这里是我的问题的一些上下文,编写为伪 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));
}
}

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

问题:当我在 ViewModelClass 中发出一些(一堆)通知时上课,有某种下意识的 react 设置 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

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

最佳答案

我关于 Stack Overflow 的第一个问题是关于 Windows 窗体应用程序中的一个字段,其中包含一个意外值,比如你的。解决方案是等到触发表单加载事件来设置表单的 GUI 元素。

我会推迟设置 _model (包括使用 new 构建它)和其他 GUI 元素,直到在表单加载事件的处理程序中。

如何:

在 Visual Studio 中添加表单加载处理程序:

  • 在图形 View 中打开表单(例如,在解决方案资源管理器中双击 SomeForm.cs)
  • 在表单中双击任何控件或其他 GUI 元素(例如,在标题栏中)。这将为名为 SomeForm_Load 的函数添加骨架代码。和行 this.Load += new System.EventHandler(this.SomeForm_Load);将添加 SomeForm.Designer.cs .

  • 将设置代码移至 SomeForm_Load :
    private void SomeForm_Load(object aSender, EventArgs anEvent)
    {
    _model = new ViewModelClass;

    ViewModelClassBindingSource.DataSource = _model;
    SomeControl1.SetModel(_model);
    }

    = new ViewModelClass 的声明中删除“ _model” .

    关于.net - 当我在父对象上引发通知事件时,为什么 Windows 窗体数据绑定(bind)要设置我的嵌套 bool 数据绑定(bind)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4258232/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com