2012-04-03 19 views
2

多くのデータ視覚化領域を持つリソース集約型ダッシュボードアプリケーションを作成しています。私はフレームを使用し、WPFページを使用して一度に1つずつ必要なページを読み込むことが最善であると考えています。これらのページには、さまざまなデータコンテキストやセキュリティ制限などもあります。しかし、別の開発者は、TabControlを使用して同じことを達成できると言います。WPF TabControl vs. Pages

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

答えて

2

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

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

<TabControl> 
    <TabItem DataContext="{Binding Context1}" /> 
    <TabItem DataContext="{Binding Context2}" /> 
</TabControl> 
1

。 Tab Collection(MVVMと思う)にバインドすると、タブが選択されたときにのみ作成されます。コレクションを使用してタブを残して戻ってくると、もう一度構築されます。 XAMLでタブを作成すると、ウィンドウがロードされるときにタブがすべてビルドされます。はい、各タブごとに異なるDataContextを持つことができます。遅延ロードの場合は、TabItemプロパティIsSelectedにバインドされ、falseの場合、クラスのすべてのプロパティは(高速)静的型準拠の値を返します。 IsSelectedがtrueに変更された場合は、実際の値をロードしてNotifyPropertyChanged(実際の値を保存します)を呼び出します。

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

関連する問題