加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

.net – 为什么当我在父对象上引发通知事件时,为什么Windows For

发布时间:2020-12-14 01:41:43 所属栏目:Windows 来源:网络整理
导读:好的,所以这里是我的问题的一些上下文,写为伪C#代码(随意指出任何错误):(你可以直接跳转到stacktrace并稍后阅读上下文) public class SomeForm { private _model = new ViewModelClass public void new() { // Normal Winforms init omitted ViewModelClassB
好的,所以这里是我的问题的一些上下文,写为伪C#代码(随意指出任何错误):(你可以直接跳转到stacktrace并稍后阅读上下文)
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或SomeControl类中进行数据绑定. (ComplexObject.BoolProp在两者中都是数据绑定的).不要犹豫,就更多的问题询问上下文.

问题:当我在ViewModelClass类中进行一些(通知)通知时,使用这种堆栈跟踪,可以将ComplexObject.BoolProp设置为false:

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

为什么程序想要将SomeBool设置为false?我怎么能防止呢?

我在Stack Overflow中的第一个问题是Windows窗体应用程序中的一个字段,其中包含一个意想不到的值,就像你的.解决方案是等待窗体加载事件被触发以设置窗体的GUI元素.

我将推迟设置_model(包括使用新建构造)和其他GUI元素,直到在窗体加载事件的处理程序中.

如何:

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

>在图形视图中打开窗体(例如,在解决方案资源管理器中双击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);
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读