Двухстороннее связывание в приложении Winforms делает ввод текста в TextBox мучительно медленным - PullRequest
0 голосов
/ 13 февраля 2012

Я установил двустороннюю привязку между моей формой (в ней 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));
            }
        }
}

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012

Это не должно быть так медленно, но есть возможность изменить текстовое поле при нажатии клавиши или при потере фокуса.Попробуйте установить его на потерянный фокус.Также в вашем установщике обязательно проверьте значение _baseTagName! = Перед установкой и возбуждением события.Это также замедлит процесс.

Итак, сначала попробуйте изменить привязку следующим образом:

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

Посмотрите эту ссылку MSDN: http://msdn.microsoft.com/en-us/library/system.windows.forms.datasourceupdatemode.aspx. Это означает, что вместо этогопри каждом нажатии клавиши, вызывающей добавление нового строкового значения в свойство, оно будет выполняться только при валидации (что происходит как часть элемента управления, теряющего фокус).

Во-вторых, измените реализацию своего свойства, чтобы соответствовать этому:

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

Сейчас вы вызываете событие независимо от того, изменилось ли свойство на самом деле или нет.Это также отрицательно сказывается на производительности.

0 голосов
/ 11 июня 2013

Я столкнулся с той же самой проблемой с BindingSource. Это не имеет никакого отношения к режиму обновления или частым срабатываниям уведомлений (хотя косвенным образом). Текущая реализация заставляет каждый отдельный связанный элемент обновляться всякий раз, когда любое свойство изменяется. Таким образом, причина, по которой OnValidation является меньшей проблемой, очевидна, это происходит реже.

Довольно легко проверить тоже. Добавьте два счетчика, увеличивайте каждый при обращении к получателю или при вызове NotifyProperChanged. В моем случае, примерно с 40 элементами, я бы был в 1/40 после загрузки формы. Добавьте символ в текстовое поле, внезапно в 2/80. Удерживая нажатой клавишу, мое приложение перестало отвечать на запросы. Как только он, наконец, догнал, граф стал на что-то нелепое, как 50/2000. Все из одного элемента меняется.

Я могу ошибаться, но я не понимаю, как это имеет смысл или может быть желаемой реализацией. Зачем мне нужно обновлять всю форму, когда один элемент изменяется, в первую очередь побеждает точку привязки определенных элементов.

...