2013-05-15 97 views
0

我正在學習WPF和我有一個關於綁定一個組合框的問題在WPF中,如何將組合框綁定到TabControl項目?

我有一個簡單的WPF窗口,帶有以下控件:一個ComboBox在頂部,一個TabControl在它下面。

我用兩個標準TabItems填充tabcontrol。然後,我添加了一些標籤 - 但是這些是我自己的「MyTab」類,它只是繼承了TabItem。我並沒有壓倒一切,也沒有做任何異乎尋常的事情,我只是添加了一些公共財產。

我想使用ComboBox作爲導航工具。每個選項卡都有一個標題,並且該標題應該成爲ComboBox中的一個項目。如果從組合框中選擇,它應該使相應的選項卡成爲活動的選項卡。

這裏是我的組合框設置:

<Window.Resources> 
     <DataTemplate x:Key="EmployeeListTemplate"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Path=Header}" /> 
      </StackPanel> 
     </DataTemplate> 
    </Window.Resources> 

..然後在XAML進一步下跌...

<ComboBox Grid.Row="1" Width="500" Name="qlist" 
ItemsSource="{Binding ElementName=tabControl1, Path=Items}" 
ItemTemplate="{StaticResource EmployeeListTemplate}" /> 

所以我只是結合到TabControl的項目收集和採摘標題作爲SelectedItem的屬性顯示。

它的作品,當我點擊組合框,標題確實顯示爲單個文本項目。但是當我做出實際選擇時,該選項卡本身會在該組合框的選擇區域中呈現!

我該如何解決這個問題?爲什麼它爲列表使用Header屬性,但是當我從列表中選擇時,它顯示的值將變成實際的TabItem對象?我覺得我失去了一些明顯的東西

順便說一下,我知道我說過我想用這個來控制導航,但是我把所有這些都刪掉了,在我弄清楚這件令人發狂的事情後我會擔心它。

Showing proper items in combobox

細心觀察 - 當我拿起tabItem1從ComboBox,它實際上重新呈現,該控件內標籤項目。您可以看到它的頂部,由列表項使用的標準藍色選擇背景環繞。鬱悶了。

tabItem painting in combobox

我在做什麼錯在這裏?感謝您的幫助

+0

這是WPF中的一個實際錯誤。有一個解決方案,它張貼在這裏:http://stackoverflow.com/questions/546119/controlling-the-tabcontrol-active-tab-with-a-combobox – Zadam

+0

這是非常有益的!謝謝!與此同時,我用一個Listbox代替它,並且它工作正常。包括雙向綁定,所以我可以從選項卡控件或列表中選擇活動選項卡。這讓我瘋狂。謝謝你給我另一個參考 –

回答

1

這是WPF的工作方式。如果所選項目可以在沒有DataTemplates的情況下呈現,那麼將會這樣做。由於Items集合是VISUAL元素的集合,因此DataTemplate不會用於呈現「selected」元素。

注意:這裏選定的項目使用ContentPresenter,而下拉列表使用另一個名爲ItemsPresenter的東西,它總是使用DataTemplate呈現,即使底層綁定對象可以不帶一個。

您需要將您的ComboBox & TabControl ItemsSource綁定到您自己的自定義列表中。這樣你最終會得到你想要的。或者,您可以覆蓋ComboBox完整的可視化樹(http://msdn.microsoft.com/en-us/library/dd334408%28v=vs.95%29.aspx) - 請參閱ContentPresenter部分。用你的數據模板替換它。

+0

對不起,我花了這麼長時間來標記這個答案。我花了一段時間才掌握所有這些,而且你確實是對的。已經差不多一年了,我學到了很多東西,我回頭看,這是我學習中的關鍵時刻。我最終創建了一個像你提到的包裝類,並綁定到我自己的屬性上,它返回了視覺效果。這給了我想要的結果 –