【问题标题】:WPF - Combobox does not show selecteditemWPF - 组合框不显示选定项
【发布时间】:2016-12-30 12:30:01
【问题描述】:

我是 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。这些选项卡的标题也需要显示在组合框中以供选择

【问题讨论】:

    标签: wpf vb.net xaml combobox


    【解决方案1】:

    因为 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 属性设置为 ContentControls 的 IEnumerable 通常没有多大意义。您可以改为将 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 属性相同的值。

    【讨论】:

    • 是的,这似乎可以解决问题。也感谢您澄清它,这对我来说很有意义。 !
    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2013-08-06
    相关资源
    最近更新 更多