2

私は、データの視覚化の多くの領域を持つ、リソースを大量に消費するダッシュボードアプリケーションを作成しています。フレームを使用し、WPFページを使用して必要なページを1つずつロードするのが最善だと思います。これらのページには、さまざまなデータコンテキスト、セキュリティ制限などもあります。しかし、別の開発者は、TabControlを使用して同じことを実行できると言います。

TabControlは、アプリケーションの起動時に、すべてのタブのすべてのアイテムを一度にロードしますか?または、WPFページのように必要に応じてそれらを遅延ロードできますか(ページは移動時にコンテンツのみをロードします)?また、TabControlのアイテムごとに異なるデータコンテキストを持つことはできますか?

4

2 に答える 2

2

WPFでは、UI仮想化を使用できます。これは、表示されているコントロールのみが初期化およびレンダリングされることを意味します。私の知る限り、はTabControlデフォルトでUI仮想化をサポートしていませんが、手動で追加するか、別のコントロールを使用することができます。パフォーマンスのヒントを紹介する次の記事をご覧ください。UIとデータ仮想化には違いがあるとも言われています。コントロールを表示しないということは、基になるデータがメモリにないことを意味するわけではありません。すべてのバインディングターゲットがロードされますが、コントロールはレンダリングされません。

あなたの2番目の質問に:はい、すべてTabItemが独自のものを持つことができますDataContext。TabControlsを使用してItemsSourceアイテムのリストをバインドする場合、 DataContextforeveryはリストのTabItem1つのアイテムになります。手動で追加する場合は、次のようにTabItems設定できます。DataContext

<TabControl>
    <TabItem DataContext="{Binding Context1}" />
    <TabItem DataContext="{Binding Context2}" />
</TabControl>
于 2012-04-03T19:51:10.190 に答える
1

想像以上に複雑です。タブ コレクション (MVVM と考えてください) にバインドすると、タブは選択されたときにのみ作成されます。コレクションを使用すると、タブを離れて戻ってくると、再びビルドされます。XAML でタブを作成すると、ウィンドウの読み込み時にすべてのタブが作成されます。はい、タブごとに異なる DataContext を持つことができます。遅延読み込みのために私が行うことは、TabItem プロパティ IsSelected にバインドすることです。それが false の場合、クラス内のすべてのプロパティは、(高速) 静的型に準拠した値を返します。IsSelected が true に変更された場合は、実際の値を読み込み、NotifyPropertyChanged を呼び出します (実際の値を保存します)。

大きなオブジェクトをロードし、1 つのタブが要約である場合、私はこれを使用します。タブは仮想化されませんが、大きなリストがある場合は、確実にタブで仮想化を使用してください。BackgroundWorker を使用してプロパティを作成できますが、プロパティが返され、その返された値をバインドすると、UI コントロールがレンダリングされるまで UI がロックされます。私にとって、単一のフレームとタブの再利用は UI の問題です。コードを分割するために、通常はフレームとページを含むタブを読み込みます (通常は ctor 内のページにデータを渡して動的コンテンツを読み込みます)。

于 2012-04-03T20:37:34.397 に答える