3

私は WPF アーキテクチャとして MVVM を使用しており、WPF TreeView を遅延読み込みとして実装しています (展開するまで、子項目は再帰的に読み込まれません)。

ただし、展開時に非同期読み込みも実装する必要があります。それを行う方法はありますか?これをコード ビハインド/アプリケーション レベルではなく、コントロール レベルで維持する必要があります。

ありがとう

4

4 に答える 4

2

コントロール自体にこれを実装する必要があるのはなぜですか?

それが絶対的な要件ではないと仮定すると、指定されたノードの子を返すプロパティでこれを処理します。子がまだ設定されていない場合は、バックグラウンド スレッドを使用して子を読み込み、見つかったときに UI スレッドに通知してから、子オブジェクトを子のコレクションに追加します。ObservableCollection(または少なくとも を実装するコレクション)を使用していると仮定するとINotifyCollectionChanged、子が追加されると、非同期で UI に表示されます。

于 2009-09-15T22:51:27.443 に答える
0

これを行う方法は次のとおりです。

  1. タイプIEnumerableの添付プロパティを作成します
  2. プロパティのPropertyChangedハンドラーで、送信者をTreeViewItemにキャストし、IsExpandedプロパティを確認します。
  3. IsExpandedがtrueの場合、フィルルーチンに対してApplicationPriority.ApplicationIdle優先度でDispatcher.BeginInvokeを実行します。
  4. IsExpandedがfalseの場合、それがtrueになると検出するイベントを設定し、コールバックでDispatcher.BeginInvokeを実行ルーチンに実行します
  5. 塗りつぶしルーチンで、ターゲットコントロールのItemsSourceを添付のプロパティ値に設定します
  6. HierarchicalDataTemplateを介して設定する代わりに、スタイルを使用してTreeViewItemに添付プロパティを設定します(ItemsSourceは省略します)。

これにより、TreeViewItemが展開されるまでItemsSourceが設定されるのを防ぎます。このメカニズムの作成は多少の作業ですが、作成したら、HierarchicalDataTemplateからItemsSourceを削除し、代わりにItemContainerStyleに設定するだけで、TreeViewの遅延ロードを行うことができます。

于 2010-03-03T19:13:11.827 に答える
0

遅延読み込みと HierarchicalDataTemplates を使用すると、読み込みを選択したアイテムのみが取得されます。TreeView は、展開/折りたたみの切り替えボタンを表示するかどうかを決定するために、表示されているものの 1 つ下のレベルを読み込む必要があることに注意してください。

于 2009-09-16T14:32:28.603 に答える
-3

ロードの遅延が必要なすべての UI 要素に対して、「View GUID」を使用しました。

例による説明:

  1. 最初は Control.Tag = "0000-0000 ...."
  2. ユーザーがインタラクションを行い、
    • ランダムな GUID が生成されます。つまり、guid1
    • Control.Tag = guid1
    • スレッドが作成されます (何をするか、コントロール、guid1)
  3. その間に、ユーザーは別のインタラクションを行います
    • ランダムな GUID が生成されます (今回は guid2)
    • Control.Tag = guid2
    • (what do to, control, guid2) を取るスレッドが作成されます
  4. 最初のスレッドは次のように終了します。
    • 結果と実行前に取得したGUIDを取得するUIスレッドにコードを呼び出します
    • 呼び出されたコードは Control.Tag != guid1 をチェックし、変更を加えません
  5. 2 番目のスレッドが終了します。
    • 結果と実行前に取得したGUIDを取得するUIスレッドにコードを呼び出します
    • 呼び出されたコードは Control.Tag == guid2 を認識し、変更を加える
于 2010-03-03T06:42:30.397 に答える