0

私が最初にWPFを始めた主な理由は、データバインディングのすべての素晴らしい可能性の約束でした。何日もの頭痛の種の後で、私は最も一般的なシナリオの1つが不可能であると思い始めています、そして私は間違っていると証明されたいです!:)

  • カスタムクラスのインスタンスをListItemsとして持つListBoxがあります。
  • 私のクラスは、いくつかのDependencyPropertiesを実装することにより、DataBindingに対応しています。
  • 私のリストボックスには、これらのプロパティを適切なレイアウトで表示するためのカスタムDataTemplateがあります。
  • ListBoxのItemsSourceはObservableCollection<MyClass>
  • リストボックスには数百、さらには数千のアイテムを表示する必要がある場合があるため、レスポンシブUIを維持するには、それらをバックグラウンドでインスタンス化する必要があります

DependencyObjectsである限り、バックグラウンドスレッドでクラスのインスタンスを作成し、UIスレッドのObservableCollection(またはItemsSourceを省略した場合はリストボックスに直接)に追加することは不可能であることがわかりました。例外をスローします

DependencyObjectと同じスレッドにDependencySourceを作成する必要があります

WPFでこのようなシナリオをどのように処理する必要がありますか?DPをまったく使用せず、INotifyPropertyChangedを使用しますか?彼らがこれをする必要があるとき、人々は実際に何をしますか?これはかなり一般的なシナリオだと思います。「マゼンタ」と入力した場合にTextBoxの背景色を変更する可能性について、ほとんどのDataBinding関連の記事が乱雑になっていることに非常に腹を立てています... :)

4

2 に答える 2

2

コントロールを実装または拡張する場合にのみ、依存関係プロパティを実装します。バインドされているすべてのデータは、単にINotifyPropertychangedを使用します。Josh SmithのMVVMパターンの記事を見てください。これは、私にとってこれの多くを明らかにしたものです。

また、より非同期のパターンに移行する際に、最近はReactiveUIを使用しています。これは、パターンに多くの非同期コマンドも組み込まれているためです。

于 2012-10-14T12:08:37.463 に答える
2

INotifyPropertyChanged代わりに(私が推奨したように)使用するか、オブジェクトFreezableを作成して作成後にフリーズするか、オブジェクトの作成を個別のステップまたはグループに分割して、各ステップを個別のディスパッチャーメッセージで実行することができます。たとえば、オブジェクトを10個のグループで作成し、それぞれを独自の優先度の低いディスパッチャメッセージで実行します。

于 2012-10-14T12:44:20.743 に答える