2012-04-03 100 views
2

我正在創建一個資源密集的儀表板應用程序,該應用程序將具有許多數據可視化區域。我認爲最好使用框架並使用WPF頁面一次加載一個頁面。這些頁面也會有不同的數據上下文和安全限制等。但是,另一位開發人員說我可以使用TabControl完成同樣的事情。WPF TabControl與Pages

在應用程序啓動時,TabControl是否一次加載所有選項卡中的所有項目?或者,我可以像使用WPF頁面一樣懶惰地加載它們(頁面只在導航時加載內容)?另外,你可以在TabControl中每個項目有不同的數據上下文嗎?

回答

2

在WPF中,您可以使用UI虛擬化,這意味着只有可見控件纔會被初始化並呈現。據我所知,默認情況下,TabControl不支持UI虛擬化,但也許可以手動添加它或使用其他控件。也許你想看看下面的article,它提供了一些性能提示。還有人提到UI和數據虛擬化之間存在差異。不顯示控件並不意味着底層數據不在內存中。所有綁定目標都將被加載,但控件不會被渲染。

第二個問題:是的,每TabItem可以有自己的DataContext。如果使用TabControls ItemsSource綁定項目列表,則DataContextTabItem)將成爲列表中的一項。如果手動添加TabItems,您可以設置DataContext這樣的:

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

更復雜的比你猜。如果綁定到Tab Collection(認爲MVVM),那麼該選項卡僅在被選中時才被創建。如果你留下一個標籤並回來,它會重新構建。如果您在XAML中創建了選項卡,那麼這些選項卡都將在窗口加載時生成。是的,您可以爲每個選項卡使用不同的DataContext。我爲延遲加載做的事情是綁定到TabItem屬性IsSelected,如果它是false,則該類中的所有屬性只返回(快速)靜態類型兼容值。如果IsSelected更改爲true,則我加載實際值並調用NotifyPropertyChanged(並保存實際值)。

我使用heck out這是我加載一個大對象和一個選項卡是一個總結。標籤不能虛擬化,但如果你有大的列表,那麼肯定在標籤中使用虛擬化。你可以使用BackgroundWorker來創建合適的網頁,但是一旦它返回並且你綁定了返回的值,UI就會被鎖定,直到呈現UI控件。對我來說重複使用一個框架與標籤是一個UI的事情。爲了分解代碼,我通常會加載一個帶有框架和頁面的選項卡(我通常會將數據傳遞到ctor中的頁面以加載動態內容)。