WPF - Combobox没有显示选定项目

时间:2016-12-30 12:30:02

标签: wpf vb.net xaml combobox

我是WPF和VB的新手,我很难搞清楚为什么我在ComboBox下拉列表中选择的东西在选择后没有显示在ComboBox中。

我的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)然后在类的构造函数中加载ComboBoxes内容,数据确实显示在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中添加一个属性,该属性包含ComboBox显示的选定项目或缺少的内容?

编辑:只是为了澄清我想要实现的目标:我有一个带有许多选项卡的TabControl。这些选项卡的标题也需要显示在ComboBox中以供选择

1 个答案:

答案 0 :(得分: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>

当您打开下拉菜单时,您会看到&#34;标题&#34;但是当您选择项目并关闭下拉列表时,您将看到&#34;内容&#34;。

将ComboBox的ItemsSource属性设置为IEnumerable的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对象的Content属性设置为与其Header属性相同的值。