データバインディングの大規模な通知を避ける方法
-
19-09-2019 - |
質問
データバインディングシナリオでは非常に一般的な問題だと思います。バッチアップデートを実行していて、プロパティチェンジ依存の計算/アクション/すべてのアップデートに対して実行されることを避けたい場合、通常はどうしますか?
通常私の頭に浮かぶ最初のことは、新しいブール値を紹介するか、イベントハンドラーを外す/フックすることです...
私がこのアプローチについて気に入らないのは、次のとおりです。
- 彼らは新しい複雑さを紹介します(維持する必要があります...)
- 抑制された通知が後に送信されることを確認する必要があるため、エラーが発生しやすいです
誰かがこの問題にすでにより便利な方法で対処しているのではないかと思っていますか?
ティア・マーティン
編集:私を逃さないでください。私は.NETがバインディングリストからRaisElistChangedEventsのように提供するものについて知っています...それらはすべて、私が説明したのと同じ方法で問題に対処していますが、私はリストされた欠点をリストする必要のない別の方法を探しています。たぶん私は間違った軌道に乗っていますが、私はここで試してみますが...
解決
残念ながら、1つのサイズに適合したソリューションはありません。次のソリューションを適用または見ました。
2つのシンガルがあります。 1つの信号は、ユーザーアクションからの変更が発生したときに放出され、もう1つは常に発射されます。これにより、UIの変更とコードごとの更新を区別できます。
コードを保護するためのブール値
プロパティイベントフレームワークは、値が実際に変更されなかったときに自動的にイベントの伝播を停止します。
信号または信号マネージャーのフリーズ/解凍方法(つまり、フレームワーク全体)
信号を単一のものにマージする方法。 nアップデートを実行でき、m <= nでm信号に収集されます。同じプロパティを100回変更すると、1つの信号しか取得できません。
信号のキューイング(同期実行の代わりに)。キューイングコードも信号をマージできます。 「保存」ボタンがないアプリケーションで大成功を収めてこれを使用しました。すべての変更は、データベースを作成する際にデータベースに保存されます。テキストを変更すると、変更は特定の時間(つまり、以前のDB更新が戻るまで)にマージされ、その後、単一の変更としてコミットされます。
一度にいくつかの値を設定するAPI。 1つの信号のみが放出されます。
信号フレームワークは、さまざまなレベルの粒度で信号を送信できます。名前の人がいるとします。名前を変更すると、2つの信号が表示されます。1つは名前の変更と1つの「インスタンスフィールドが変更されました」。したがって、「何かが変わった」だけを気にする場合は、すべてのフィールドではなくインスタンスに接続できます。
他のヒント
どんなプラットフォーム?投稿は私に.netを考えさせます。
基礎となるオブジェクトは何ですか?例えば、 BindingList<T>
ソースとして、設定して通知を無効にすることができます RaiseListChangedEvents
更新を行っているときにfalseに。
それ以外(または類似);はい、大きな更新中にバインディングを外します
取るのが最も簡単なルートは、を使用することです BindingSource
データバインディングのコンポーネント。コントロールを特定のオブジェクト(またはイリスト)にバインドする代わりに、そのオブジェクトを次のものとして使用します DataSource
のために BindingSource
, 、次にコントロールをにバインドします BindingSource
.
BindingSource
クラスにはあります SuspendBinding()
と ResumeBinding()
機能。