我是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中以供选择
答案 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属性相同的值。