當我涉及到WPF當前的綁定需求時,我處於綁定(無雙關語意圖)。我花了一天中最好的時間來研究我的問題,但我找不到解決我的問題的可靠解決方案。這裏是:在WPF中綁定到TabControl的ItemsSource
我想創建一個用戶控件,表示我正在調用工作區(Josh Smith的博客參考)。工作區將顯示在選項卡控件中。我打算使用標籤界面來管理我在非常酷的工作簿瀏覽器中打開的各種文檔。
每次用戶創建一個新的工作區時,該工作區都應顯示在選項卡控件中。每個工作區都採用用戶控件的形式,每個工作區都有自己的視圖模型。我希望Tab Header能夠從我的視圖模型中顯示一個屬性,我認爲它可能必須通過我的用戶控件作爲屬性公開。
到目前爲止,直到遇到很多問題時,我最喜歡的最乾淨的解決方案是使用數據模板。基本上我做了以下內容:
<DataTemplate x:Key="WorkspaceItem">
<DockPanel Width="120">
<ContentPresenter
Content="{Binding Title}"
VerticalAlignment="Center"
/>
</DockPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type CustomerViewModel}">
<workspace:CustomerWorkspace />
</DataTemplate>
<TabControl ItemsSource="{Binding Workspaces}" ItemTemplate="{StaticResource WorkspaceItem}"/>
的TabControl.ItemsSource必然包含了所有我的工作空間的(對象)一個ObservableCollection。
這個工作,除了兩件事情很大:
如果我打開多個客戶,然後我有多個工作區中打開。由於DataTemplate Recycling,當我從一個標籤切換到另一個標籤時,我失去了狀態。所以所有不受約束的東西都會失去狀態。
不同工作空間(使用不同數據模式)之間交換的性能非常緩慢。
所以...我從SO上的另一個用戶發現了一個建議,將用戶控件添加到ObservableCOllection並丟棄數據模板。現在解決了失去國家的問題之一。但是,我現在面對的2個遺留問題:
- 我如何設置TabItem.Header屬性,而不使用一個DataTemplate
- 交換來回標籤之間的速度依然很慢,除非他們的相同的DataTemplate。
然後我開始實際添加一個TabItem到我的代碼隱藏的ObservableCollection中並將TabItem.Content屬性設置爲用戶控件的屬性。現在已經消除了速度問題,因爲我已經刪除了DataTemplates的使用,所以這是丟失狀態問題。但是,我現在堅持將TabItem.header綁定到應該在Tab標題中顯示的我的usercontrol的Custome「Title」屬性上。
所以在此之後非常長的帖子,我的問題是:
有沒有辦法使用的DataTemplates,迫使他們在集合中創建的每個項目一個新的實例,以防止回收和國家的損失。 1)。有沒有比我在上面的帖子中提到的更好的選擇?
有沒有辦法通過Xaml完成所有這些工作,而不是通過Tab項目的後端代碼構建?