2016-12-30 167 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

是的,这似乎是伎俩。感谢您澄清它,这对我来说很有意义。 ! –