TextBox UpdateSourceTrigger = PropertyChanged - это действительно влияет на производительность? - PullRequest
4 голосов
/ 30 июня 2011

Документация MSDN гласит:

Привязки, являющиеся TwoWay или OneWayToSource, прослушивают изменения в целевом свойстве и распространяют их обратно к источнику.Это известно как обновление источника.Обычно эти обновления происходят всякий раз, когда целевое свойство изменяется.Это хорошо для флажков и других простых элементов управления, но обычно не подходит для текстовых полей. Обновление после каждого нажатия клавиши может снизить производительность и лишает пользователя обычной возможности вернуться назад и исправить ошибки ввода перед принятием нового значения.Поэтому значением UpdateSourceTrigger по умолчанию для свойства Text является LostFocus, а не PropertyChanged.

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

Но если это просто обновление простого DependencyProperty или свойства объекта Entity Framework (до фиксации),не будет ли падение производительности незначительным?

Просто интересно, потому что я создаю приложение WPF, которое отслеживает состояние редактируемого объекта и оптимизирует внешний вид кнопки Сохранить в зависимости от того, были ли внесены изменения.Я подумал, что самый простой способ определить изменения - это отловить соответствующие события SourceUpdated в зависимости от ситуации.Он работает оптимально, когда UpdateSourceTrigger = PropertyChanged для текстовых полей, так как пользователь получает мгновенную обратную связь о наличии «сохраняемых» изменений.

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Причина, по которой вас предупреждают о снижении производительности, заключается в том, что, по большей части, если вам нужно обновлять свойство источника при каждом нажатии клавиши, это потому, что вам нужно что-то, что происходит при изменении значения свойства. В конце концов, если вам не нужно, чтобы это «что-то» происходило, вам было бы наплевать, когда свойство будет обновлено, если это в конечном итоге произошло.

Реальное влияние на производительность полностью зависит от того, что это «что-то». И это полностью зависит от вашего приложения. Если это «что-то» форматирует и отображает значение в другом TextBlock, выполнение этого при каждом нажатии клавиши, вероятно, не будет заметно. Если он фильтрует 10 000 строк DataTable и обновляет привязанный к нему DataGrid, он, вероятно, будет.

Так как вы говорите? Ну, есть два пути:

1) Понять вашу заявку. Если вы знаете, что делает приложение, когда вы обновляете исходное свойство, вы можете предсказать, будет ли это делать при каждом нажатии клавиши. Когда вы говорите: «Я думаю, мне было интересно, может ли это быть на первый взгляд нормально, но на самом деле это может вызвать проблемы в определенных ситуациях, о которых я не знаю», - вы на самом деле говорите: «Что произойдет, если я не не знаете, что делает мое приложение, когда пользователь нажимает клавишу? "

2) Если вы не знаете, что делает ваше приложение, когда пользователь нажимает клавишу, профилируйте ее.

1 голос
/ 30 июня 2011

Если он подходит для вашего приложения, и вы не заметите существенного снижения производительности, тогда нет проблем с установкой UpdateSourceTrigger на PropertyChanged. Фактически, если вы используете инфраструктуру MVVM, такую ​​как Caliburn.Micro , тогда она будет установлена ​​как настройка по умолчанию для всех текстовых полей.

...