1

私のアプリには、キーと値のペアの形式で外部ソースから定期的にデータを取得するバックグラウンド スレッドがあります。アプリ全体の多数のビューでデータが必要になるため、おそらく何らかの静的 (?) モデルに格納することによって、バインディング用にこのデータを公開したいと思います。これらのキーは数百ある可能性があり、顧客ごとに異なる可能性があるため、各値のプロパティを持つ INotifyPropertyChanged モデルを単純に作成することはできません。

このアプリには、一度に複数のビューが表示されます。それぞれのビューには、上記のコレクション内の個々の項目にバインドしたい多数のコントロール (通常はテキスト ボックス) があります。コレクション内の値が更新されると、その項目のみにバインドされたすべてのコントロールが変更され、新しい値が反映されます。ObservableCollection単一のアイテムを変更すると、バインドされているアイテムに関係なく、すべてのコントロールが更新されるため、ここでは適していないと思いますか?

ミックスをさらに複雑にするために、一部の値 (数値) は表示用に書式設定する必要があります。フォーマット ルールはユーザー定義であるため、XAML バインディングのStringFormat式に (たとえば) ハードコードすることはできません。理想的には、生の値 (計算用など) とフォーマットされたバージョン (表示用) の両方にアクセスできる必要があります。巧妙な WPF 機能を使用して、後者を実現できるはずです。

これらの要件をどのように解決できるかについての指針をいただければ幸いです。

編集:私は以前にモデルをある種のコレクションとして実装しようとしたことに言及する価値があります。問題は、最初にすべての値が取り込まれるわけではなく、しばらくしてから追加されることです。それら最終的に追加されても、バインドされたコントロールは更新されません。おそらく、最初に欠落している値にバインドできなかったためです。

4

3 に答える 3

1

別のアプローチ、つまりEvent Aggregationのバリエーションを採用します。コレクション全体を管理する単一のクラス (おそらく franssu が提案したようなシングルトン クラス) がありますが、そのクラスのコレクションに直接バインドする代わりに、個々のビューにより固有の小さなモデルを作成します。

メイン モデルが新しいアイテムを受け取ると、イベントを発行します。これは、新しいアイテムを検査し、そのアイテムを内部コレクション (個々のビューがバインドされているもの) に追加する必要があるかどうかを判断できる小さなモデルによって消費されます。 )。それが彼らの見解に「属していない」場合、彼らは単純にそのイベントを無視することができます。

アイテムなどの更新に同様のイベント発行を使用できますが、実際のアイテムにバインドしている場合はおそらく必要ありません。

于 2012-08-23T13:04:44.627 に答える
1

INotifyCollectionChangedInterface と を実装するだけINotifyPropertyChangedで、ObservableCollection のようなコレクションを取得できます。

ただし、コレクション (ObservableCollection など) からアイテムを選択し、そのアイテムを変更すると、他のコントロールが更新されないことに注意してください。したがって、コレクションに Person クラスがあり、ある人物の名前を変更すると、他のコントロールはその人物の新しい名前を取得しません。

Person オブジェクト内では、INotifyPropertyChangedインターフェイスを実装し、名前が変更されたときにイベントを発生させる必要があります。

だから私があなたに伝えたいのは: インターフェイスINotifyCollectionChangedを持つコレクションは、バインドされたコントロールにのみ通知します: 新しい項目があり、項目が削除されたか、項目インデックスが変更されましたが、項目自体が変更された場合は通知されません。

したがって、上記のポイントを提供する Collection と、コレクションのプロパティが変更された場合にイベントを発生させるコレクションに含まれる Item が必要になります。

于 2012-08-23T13:05:46.650 に答える
0

ObservableCollectionここで完璧です。ItemsControlにバインドされた標準ObservableCollectionは、コレクション内のすべてのアイテムではなく、変更されたアイテムのコントロールのみを更新することがわかります。

これが存在する理由ですObservableCollection。発生するイベントは、変更されたアイテムを明確に識別し、UI がそれらを適切に処理できるようにします。

これを小さな WPF アプリでローカルにテストしたところ、正常に動作しました。ただし、仮想化された項目パネルは、スクロール時にこの動作を壊しているように見えることに注意してください...

編集:質問を読み直すと、実際には「コレクション内の値が更新されると...」と言うコレクションにクラスのインスタンスが含まれていて、クラスのプロパティを更新する場合ObservableCollection、これが機能する必要さえありません-実装するクラスが必要なだけですINotifyPropertyChanged

于 2012-08-23T13:05:44.770 に答える