2

データバインディングのシナリオでは、これは非常に一般的な問題だと思います。バッチ更新を実行していて、プロパティの変更に依存する計算/アクション/すべてが更新ごとに実行されるのを避けたい場合、通常はどうしますか?

通常、最初に頭に浮かぶのは、新しいブール値を導入するか、イベントハンドラーをフック/フック解除することです...

このアプローチについて私が気に入らないのは、次のとおりです。

  • それらは新しい複雑さをもたらします(維持する必要があります...)
  • 抑制された通知が後で送信されることを確認する必要があるため、エラーが発生しやすくなります。

誰かがこの問題に対処しやすく、より便利な方法ですでに対処しているのではないかと思っています。

ティア・マーティン

編集:誤解しないでください。私は.NETがBindingListからRaiseListChangedEventsのようなものを提供することを知っています...それらはすべて、私が説明したのとほぼ同じ方法で問題に対処していますが、欠点をリストする必要のない別の方法を探しています. 多分私は間違った道を進んでいますが、ここで試してみます...

4

3 に答える 3

2

残念ながら、万能のソリューションは 1 つではありません。次の解決策を適用または確認しました。

  1. 2つのシンガーがあります。1 つのシグナルは、変更がユーザー アクションから発生したときに発行され、もう 1 つのシグナルは常に発生します。これにより、UI の変更とコードによる更新を区別できます。

  2. コードを保護するブール値

  3. プロパティ イベント フレームワークは、値が実際に変化しなかった場合、イベントの伝播を自動的に停止します。

  4. シグナルまたはシグナルマネージャー (フレームワーク全体) のフリーズ/解凍メソッド

  5. 信号を 1 つにマージする方法。N回の更新を行うことができ、それらはM <= NであるM個のシグナルに収集されます。同じプロパティを100回変更しても、シグナルは1つしか得られません。

  6. (同期実行の代わりに) シグナルのキューイング。その後、キューイング コードもシグナルをマージできます。「保存」ボタンのないアプリケーションでこれを使用して大成功を収めました。すべての変更は、データベースに保存されます。テキストを変更すると、変更は一定の時間にわたって (つまり、前の DB 更新が戻るまで) マージされ、その後、単一の変更としてコミットされます。

  7. 一度に複数の値を設定する API。単一の信号のみが送信されます。

  8. シグナル フレームワークは、さまざまな粒度レベルでシグナルを送信できます。名前のある人がいるとします。名前を変更すると、2 つのシグナルが得られます。1 つは名前の変更用で、もう 1 つは「インスタンス フィールドが変更されました」です。したがって、「何かが変更された」ことだけを気にする場合は、すべてのフィールドではなくインスタンスにフックできます。

于 2009-07-24T13:44:11.187 に答える
1

どのプラットフォーム?この投稿では、.NET について考えさせられます。

基礎となるオブジェクトは何ですか? たとえば、ソースとして、更新中に false にBindingList<T>設定することで通知を無効にすることができます。RaiseListChangedEvents

それ以外(または類似); はい、大きな更新中にバインディングを切断します

于 2009-07-24T13:37:46.127 に答える
0

最も簡単な方法はBindingSource、データ バインディングにコンポーネントを使用することです。コントロールを特定のオブジェクト (または IList) にバインドする代わりに、そのオブジェクトを の として使用してDataSourceからBindingSource、コントロールを にバインドしますBindingSource

BindingSourceクラスにはとSuspendBinding()関数がありResumeBinding()ます。

于 2009-07-24T13:44:40.453 に答える