Как избежать массового уведомления в данных DataBinding
-
19-09-2019 - |
Вопрос
Я предполагаю, что это довольно распространенная проблема в сценариях данных. Что вы обычно делаете, если вы запускаете пакетное обновление и хотите избежать того, что расчеты/действия/действия/все, что выполняются для каждого обновления?
Первое, что обычно приходит мне в голову, - это либо представить новую логическую или отбрасывать/зацепить Eventhandler, ...
Что мне не нравится в этих подходах:
- Они вводят новую сложность (нужно поддерживать, ...)
- Они склонны к ошибкам, потому что вы должны убедиться, что потом отправляются подавленные уведомления
Мне интересно, решает ли кто -нибудь эту проблему более удобным способом, с которым легче справиться?
Тиа Мартин
РЕДАКТИРОВАТЬ: Не для того, чтобы не считать меня. Я знаю о вещах .NET предоставляет как RaiselistchangeNevents из BindingList, ... все они решают проблему более/менее так же, как я описал, но я ищу другой способ, который не должен перечислять недостатки Анкет Может быть, я не на том пути, но хотя я попробую здесь ...
Решение
К сожалению, нет единого решения для одного размера. Я применил или видел следующие решения:
Есть два сингла. Один сигнал испускается, когда изменение происходит от действия пользователя, другой всегда стреляет. Это позволяет различать изменения в пользовательском интерфейсе и обновления по коду.
Логический для защиты кода
Структура событий свойства останавливает автоматическое распространение событий, когда значение не изменилось.
Метод замораживания/оттаивания на сигнале или диспетчера сигнала (то есть вся структура)
Способ слияния сигналов в один. Вы можете делать N обновления, и они собираются в M Signals, где M <= N. Если вы измените одно и то же свойство 100 раз, вы все равно получаете только 1 сигнал.
Очередь сигналов (вместо синхронного исполнения). Код очереди может затем объединить сигналы. Я использовал это с большим успехом в приложении, у которого нет кнопки «Сохранить». Все изменения сохраняются в базе данных по мере их их создания. Когда вы меняете текст, изменения объединяются в течение определенного времени (а именно до возврата предыдущего обновления БД), а затем они будут совершены как единое изменение.
API, чтобы установить несколько значений одновременно; Только один сигнал испускается.
Сигнальная структура может отправлять сигналы на разных уровнях детализации. Скажем, у вас есть человек с именем. Когда вы измените имя, вы получаете два сигнала: один для изменения имени и одно «поля экземпляра изменяется». Так что, если вы только заботитесь, «что -то изменилось», то вы можете зацепить экземпляр вместо всех полей.
Другие советы
Какая платформа? Пост заставляет меня думать .NET.
Каковы основные объекты? Например, BindingList<T>
В качестве источника позволяет отключить уведомления путем настройки RaiseListChangedEvents
Ложь во время выполнения обновления.
Кроме этого (или аналогичного); Да, отключите привязку во время больших обновлений
Самый простой путь, чтобы использовать BindingSource
компонент для вашего привязки данных. Вместо того, чтобы привязывать ваши элементы управления с конкретным объектом (или илистом), используйте этот объект в качестве DataSource
для BindingSource
, затем свяжите элементы управления с BindingSource
.
А BindingSource
класс имеет SuspendBinding()
а также ResumeBinding()
функции.