Winforms应用程序中的双向绑定使在TextBox中输入文本变得非常缓慢

本文关键字:文本 输入 非常 缓慢 TextBox 应用程序 Winforms 绑定 | 更新日期: 2023-09-27 18:24:09

我已经在表单(它有32个控件)和类的一个实例之间设置了双向绑定,但在TextBox中输入的每个字符都有1/2秒的延迟,这使得应用程序几乎不可用
当我使用DataSourceUpdateMode.Never时,问题没有发生,这清楚地表明双向绑定是罪魁祸首。

请注意,如果我为的每个控件设置DataSourceUpdateMode.Never,则该控件存在滞后,因此似乎不是导致该问题的绑定控件的数量。

parameterTagRecord = new PETParameterTagRecord(TagID);
baseTagNameTB.DataBindings.Add("Text", parameterTagRecord, 
         "BaseTagName", true, DataSourceUpdateMode.OnPropertyChanged);

我的课摘录:

public class PETParameterTagRecord : PETBaseObject, INotifyPropertyChanged
{
        private string _baseTagName = Constants.NullString;
        public event PropertyChangedEventHandler PropertyChanged;
        public string BaseTagName
        {
            get { return _baseTagName; }
            set
            {
                _baseTagName = value;
                NotifyPropertyChanged("BaseTagName");
            }
        }
        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
}

我做错了什么?

Winforms应用程序中的双向绑定使在TextBox中输入文本变得非常缓慢

它应该不会那么慢,但有一个选项可以在按键或失去焦点时更改文本框。尝试将其设置为失去焦点。同样在setter中,请确保选中_baseTagName!=设置和引发事件之前的值。这也会让事情变慢。

所以,首先尝试这样更改绑定:

baseTagNameTB.DataBindings.Add("Text", parameterTagRecord,  
         "BaseTagName", true, DataSourceUpdateMode.OnValidation);

请参阅此MSDN链接:http://msdn.microsoft.com/en-us/library/system.windows.forms.datasourceupdatemode.aspx.这意味着,不是每次按键都会将新的字符串值推入属性,而是只在Validation(这是控件失去焦点的一部分)时才会这样做。

其次,更改您的属性实现以匹配以下内容:

public string BaseTagName   
{   
    get { return _baseTagName; }   
    set   
    {   
        if (_baseTagName != value) {
          _baseTagName = value;   
          NotifyPropertyChanged("BaseTagName");   
        }
    }   
}

现在,您正在引发事件,无论该属性是否实际发生了更改。这也对性能不利。

我在BindingSource中遇到了同样的问题。这与更新模式或频繁触发通知无关(尽管是间接的)。当前实现导致每当任何属性发生更改时,每个单绑定元素都会刷新。因此,OnValidation问题较少的原因是显而易见的,它发生的频率较低。

检查起来也相当容易。添加两个计数器,每次访问getter或调用NotifyPProperChanged时都增加每个计数器。在我的例子中,大约有40个元素,加载表单后我会处于1/40。在文本框中添加一个字符,突然处于2/80。一直按键,我的应用程序停止响应。一旦它终于赶上了,计数就达到了荒谬的50/2000。所有这些都源于一个元素的变化。

我可能错了,但我不认为这有什么意义,也不认为这可能是想要的实现。为什么当一个元素发生变化时,我要更新整个表单,而不是首先绑定特定元素。