2016-12-30 1 views
0

Im new для WPF и VB и im, имеющих некоторые проблемы, выясняя, почему вещь, которую я выбираю в выпадающем списке ComboBox, не отображается в ComboBox после выбора.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) загружает содержимое 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, чтобы показать или что я делать я скучаю?

EDIT: Просто для выяснения того, что я пытаюсь достичь: у меня есть 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> 

При открытии выпадающего меню, вы увидите «заголовок», но при выборе пункта и закрытия выпадающего меню вы увидите «Содержимое».

Как правило, не имеет смысла устанавливать свойство ItemsSource для ComboBox в IEnumerable из ContentControls. Вместо этого вы можете связать ItemSource с 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

Да, это похоже на трюк. Спасибо, что разъяснил это, и это имеет смысл для меня. ! –