WPF Combobox获取所选项目文本并将内部值(未显示)与组合框的每个项目相关联

时间:2017-07-29 20:06:42

标签: c# wpf combobox .net-3.5

我有以下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检测组合框中当前选择的项目,但我不知道如何获取组合框中显示和当前选中的文本。例如,如果我在组合框中选择第二项,我想获得“工程师”。我该怎么办?

第二个问题

此外,我想在组合框winforms中执行相同操作,您可以在其中显示成员(winforms中的组合框的DisplayMember属性),并在内部将其与成员值(ValueMember属性相关联。您在组合框中选择项目时可以阅读的winforms组合框。例如,假设以下combox项目及其关联值。

  • “经理”:1000A
  • “工程师”:1000B

所以“经理”和“工程师”将显示在combox中,当我选择“经理”时,我将获得其相关值,即1000A,与工程师相同。在WPF中有可能吗?如果是这样的话?我已经读过可以使用DisplayMemberPathSelectedValuePath组合框属性,但我不知道该怎么做。我是否需要创建一个类并从那里填充组合然后使用绑定?任何代码都将受到高度赞赏。

更新: 对于第二个问题,最后我做了类似于解释herehere的内容。

1 个答案:

答案 0 :(得分:0)

对于第一个问题,您可以通过使用这种代码行挖掘SelectionChangedEventArgs e事件的SelectionChanged来访问ComboBoxItem的TextBlock:

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;

}

或者你可以使用这条短线,它将所有上述代码组合在一行中: (?.是C#6功能,以便在出现问题时检查空值)

var selectedText = (((e.AddedItems[0] as ComboBoxItem)?.Content as StackPanel)?.Children[1] as TextBlock)?.Text;