2017-07-29 32 views
0

の各項目に内部値(表示されていない)を関連付ける:WPFコンボボックス選択した項目のテキストを取得し、私はWPFのコンボボックスの下に持っているコンボボックス

<ComboBox x:Name="MyComboBox" 
      Grid.Column="1" 
      SelectionChanged="MyComboBox_SelectionChanged"> 
    <ComboBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel /> 
     </ItemsPanelTemplate> 
    </ComboBox.ItemsPanel> 

    <ComboBoxItem Name="cbiEmployeeManagerType"> 
     <StackPanel Orientation="Horizontal"> 
      <Image Source="/Resources/Manager.png" /> 
      <TextBlock Foreground="AliceBlue" 
         VerticalAlignment="Center">Manager</TextBlock> 
     </StackPanel> 
    </ComboBoxItem> 
    <ComboBoxItem Name="cbiEmployeeEngineerType"> 
     <StackPanel Orientation="Horizontal"> 
      <Image Source="/Resources/Engineer.png" /> 
      <TextBlock Foreground="AliceBlue" 
         VerticalAlignment="Center">Engineer</TextBlock> 
     </StackPanel> 
    </ComboBoxItem> 
</ComboBox> 

まず問題

MyComboBox_SelectionChanged以内に私が知っていますコンボボックスで現在選択されているアイテムを検出する方法はMyComboBox.SelectedIndexですが、コンボボックスで表示され現在選択されているテキストを取得する方法はわかりません。たとえば、コンボボックスで2番目の項目を選択した場合、「エンジニア」を取得したいとします。どうしたらいいですか?

第二の問題

また、私はあなたがメンバー(リサイズでコンボボックスのDisplayMemberプロパティ)を表示することができ、内部でそれをメンバー値を関連付けるためにしたコンボボックスのリサイズのように同じことをしたいと思います(ValueMemberコンボボックス内のアイテムを選択したときに読むことができます)。たとえば、次のcomboxアイテムを関連する値と仮定します。

  • 「マネージャー」:1000A
  • 「エンジニア」:1000B

だから、「マネージャー」と「エンジニア」COMBOXに表示されるだろうと私は私が得るだろう「マネージャー」を選択することになりますその関連値、つまり、エンジニアにとっては同じ1000Aです。 WPFで可能ですか?もしそうなら、どのように?私はそれがDisplayMemberPathSelectedValuePathコンボボックスのプロパティを使用して可能であることを読んだが、私はそれを行う方法がわからない。私はクラスを作成し、そこからコンボを移入してバインディングを使用する必要がありますか?コードの任意の部分が高く評価されます。

UPDATE: 第二の問題に関しては、最終的に私はherehere説明されているものと同様に行われています。

private void MyComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var selectedItem = e.AddedItems[0] as ComboBoxItem; 
    var itemStackPanel = selectedItem.Contents as StackPanel; 

    // Get the TextBlock object from 'itemStackPanel' object 
    // TextBlock is with index 1 because it is defined second 
    // after Image inside the StackPanel in your XAML 
    var textBlock = itemStackPanel.Children[1] as TextBlock; 
    // This variable will hold 'Engineer' or 'Manager' 
    var selectedText = textBlock.Text; 

} 

またはあなたがすべて兼ね備えこの短い線を使用することができます:あなたは、コードの行のこの種のSelectionChangedイベントのSelectionChangedEventArgs eを掘りでComboBoxItemののTextBlockにアクセスすることができます最初の問題については

+0

2つのノート:1行のコード上で。 1. ComboBoxにVirtualizingStackPanelを持つのは意味をなさないようです。 ComboBox.ItemsPanel全体を削除します。 2. 2つの子要素を持つStackPanelでComboBoxItemを繰り返し追加します。これは、ComboBoxのItemTemplateプロパティのDataTemplateで行う必要があります。 DataTemplateの内部では、アイテムタイプのプロパティにバインドします。 ComboBoxのItemsSourceプロパティは、このアイテムタイプのコレクションにバインドされます。開始方法については、[データテンプレートの概要](https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/data-templating-overview)を参照してください。 – Clemens

答えて

0

?.が、何かがうまくいかない場合にはnullをチェックするためにC#6の機能です)

var selectedText = (((e.AddedItems[0] as ComboBoxItem)?.Content as StackPanel)?.Children[1] as TextBlock)?.Text; 
関連する問題