2016-12-30 42 views
0

WPFとVBの新機能です。なぜComboBoxドロップダウンで選択したものが選択後にコンボボックスに表示されないのかわかりません。WPF - 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)は、その後、コンストラクタクラスのコンボボックスの内容をロードして、データがコンボボックスに表示されない

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を持っています。これらのタブのヘッダーはコンボボックスにも表示する必要があります。

答えて

2

TabItemはContentControlなので、コンボボックスはアイテムが選択されたときにコンテンツを表示します。あなたがドロップダウンを開くと

<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> 

は、あなたが「ヘッダ」を参照してくださいますが、アイテムを選択し、ドロップダウンを閉じたときには、「コンテンツ」を参照してくださいされます:あなたは、次のXAMLマークアップを使用して、この自分自身を確認することができました。

一般的に、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オブジェクトのコンテンツプロパティを設定することです。

+0

はい、このトリックを行うようです。それを明確にしてくれてありがとう、それは私には良い意味がある。 ! –

関連する問題