2016-12-30 137 views
0

Im新的WPF和VB和im有一些麻煩,搞清楚爲什麼我選擇的組合框下拉選擇後不顯示在組合框中顯示。WPF - Combobox不顯示selecteditem

我有我的ComboBox通過綁定和DataContext填充。這是我Settings.xaml文件

<Window.Resources> 
    <DataTemplate x:Key="TabList"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Path=Header}" /> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 
... 
<ComboBox x:Name="tabs" 
      ItemsSource="{Binding tabList}"          
      ItemTemplate="{StaticResource ResourceKey=TabList}" 
      Height="32" /> 

意見代碼隱藏文件(Settings.xaml.vb)然後加載在類的構造函數的組合框的內容,數據確實顯示在ComboBox

Public Class Settings 

    Private loader As SettingsLoader 

    Sub New() 
     InitializeComponent() 
     Dim sh As New SettingsHandler(True) 
     loader = New SettingsLoader 
     loader.tabList = sh.Current.Tabs 
     DataContext = loader 
    End Sub 
End Class 

SettingsLoader類看起來像這樣。 TRTab是我自己的類,它只是從TabItem的繼承,只增加了一些額外的屬性,沒有什麼花哨

Public Class SettingsLoader 

    Private _tabs As List(Of TRTab) 

    Public Property tabList() As List(Of TRTab) 
     Get 
      Return _tabs 
     End Get 
     Set(value As List(Of TRTab)) 
      _tabs = value 
     End Set 
    End Property 

End Class 

我是否需要一個屬性添加到我的SettingsLoader持有的組合框的選擇項來顯示或什麼是我錯過了?

編輯:只是爲了澄清即時通訊試圖實現:我有一個tabcontrol與一些選項卡。這些選項卡的標題還需顯示在ComboBox中供選擇

回答

2

因爲TabItem是ContentControl,所以當選擇該項目時,ComboBox將顯示其內容。你可以使用下面的XAML標記證實了這一點自己:

<Window.Resources> 
    <DataTemplate x:Key="TabList"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Path=Header}" /> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 
<StackPanel> 
    <ComboBox x:Name="tabs" Height="32" 
        ItemTemplate="{StaticResource TabList}"> 
     <TabItem Content="Content" Header="Header" /> 
    </ComboBox> 
</StackPanel> 

當您打開下拉菜單,你會看到「頭」,但是當您選擇項目並關閉下拉菜單,你會看到「內容」。

將ComboBox的ItemsSource屬性設置爲IEConumerable的ContentControls通常不會有太大意義。您可以將ItemsSource綁定到IEnumerable(Of String)。只是另一個屬性添加到您的SettingsLoader類:

Public Class SettingsLoader 
    Private _tabs As List(Of TRTab) 

    Public Property tabList() As List(Of TRTab) 
     Get 
      Return _tabs 
     End Get 
     Set(value As List(Of TRTab)) 
      _tabs = value 
     End Set 
    End Property 

    Public ReadOnly Property tabHeaders() As IEnumerable(Of String) 
     Get 
      If _tabs Is Nothing Then 
       Return Nothing 
      End If 
      Return _tabs.Select(Function(x) x.Header.ToString()) 
     End Get 
    End Property 
End Class 

<Window.Resources> 
    <DataTemplate x:Key="TabList"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding}" /> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 
<StackPanel> 
    <ComboBox x:Name="tabs" 
      ItemsSource="{Binding tabHeaders}"          
      ItemTemplate="{StaticResource ResourceKey=TabList}" 
      Height="32" /> 
</StackPanel> 

另一種選擇是設置TRTab對象相同的值的內容屬性屁股它們的頭屬性。

+0

是的,這似乎是伎倆。感謝您澄清它,這對我來說很有意義。 ! –