Получить выбранное значение из поля со списком в C# WPF

Я только что начал использовать формы WPF вместо форм Windows Forms. В форме Windows Forms я мог бы просто сделать:

ComboBox.SelectedValue.toString();

и это будет работать нормально.

Как это сделать в WPF? Похоже, у него нет выбора.

20 ответов


хорошо.. Я нашел более простое решение.

String s = comboBox1.Text;

таким образом, я получаю выбранное значение в виде строки.


Я понял, что это немного странный способ сделать это по сравнению со старыми формами WF:

ComboBoxItem typeItem = (ComboBoxItem)cboType.SelectedItem;
string value = typeItem.Content.ToString();

убедитесь, что вы установили имя для вашего ComboBox в файле XAML:

<ComboBox Height="23" Name="comboBox" />

в вашем коде вы можете получить доступ к выбранному элементу с помощью SelectedItem свойства:

MessageBox.Show(comboBox.SelectedItem.ToString());

мой XAML, как показано ниже:

<ComboBox Grid.Row="2" Grid.Column="1" Height="25" Width="200" SelectedIndex="0" Name="cmbDeviceDefinitionId">
    <ComboBoxItem Content="United States" Name="US"></ComboBoxItem>
    <ComboBoxItem Content="European Union" Name="EU"></ComboBoxItem>
    <ComboBoxItem Content="Asia Pacific" Name="AP"></ComboBoxItem>
</ComboBox>

содержимое отображается как текст и имя WPF combobox. Чтобы получить имя выбранного элемента, я должен следовать этой строке кода:

ComboBoxItem ComboItem = (ComboBoxItem)cmbDeviceDefinitionId.SelectedItem;
string name = ComboItem.Name;

чтобы получить выделенный текст WPF combobox:

string name = cmbDeviceDefinitionId.SelectionBoxItem.ToString();

Как насчет этого:

string yourstringname = (yourComboBox.SelectedItem as ComboBoxItem).Content.ToString();

Это зависит от того, что вы привязали к вашему ComboBox. Если вы связали объект с именем MyObject и имеете, скажем, свойство Name, сделайте следующее:

MyObject mo = myListBox.SelectedItem as MyObject;
return mo.Name;

решение этой проблемы просто. Все, что я сделал, это добавить "SelectedValuePath" в мой код XAML и привязать его к моему свойству модели, которое я хочу вернуть с помощью combobox.

<ComboBox SelectedValuePath="_Department"
          DisplayMemberPath="_Department"
          Height="23"
          HorizontalAlignment="Left"
          ItemsSource="{Binding}"
          Margin="-58,1,0,5"
          Name="_DepartmentComboBox"
          VerticalAlignment="Center"
          Width="268"/>

это во многом зависит от того, как поле заполняется. Если это делается путем присоединения DataTable (или другая коллекция) в ItemsSource, вы можете найти крепления SelectionChanged обработчик событий в поле в XAML, а затем с помощью этого в коде-за полезным:

private void ComboBoxName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox cbx = (ComboBox)sender;
    string s = ((DataRowView)cbx.Items.GetItemAt(cbx.SelectedIndex)).Row.ItemArray[0].ToString();
}

я видел 2 других ответа здесь, которые имели разные части этого-у одного был ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();, который выглядит похожим, но не бросает коробку в DataRowView, что-то я обнаружил, что мне нужно сделать, и еще: ((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();, используемый .SelectedItem вместо .Items.GetItemAt(comboBox1.SelectedIndex). Это могло бы сработать, но я остановился на комбинации двух, которые я написал выше, и не помню, почему я избегал .SelectedItem кроме того, что это не сработало для меня в этом случае.

если вы заполняете поле динамически, или с ComboBoxItem элементы в раскрывающемся списке непосредственно в XAML, это код, который я использую:

private void ComboBoxName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox cbx = (ComboBox)sender;
    string val = String.Empty;
    if (cbx.SelectedValue == null)
        val = cbx.SelectionBoxItem.ToString();
    else
        val = cboParser(cbx.SelectedValue.ToString());
}

вы увидите, что у меня есть cboParser, нет. Это потому, что выход из SelectedValue выглядит вот так:System.Windows.Controls.Control: Some Value. По крайней мере, в моем проекте. Поэтому вы должны проанализировать свой Some Value из этого:

private static string cboParser(string controlString)
{
    if (controlString.Contains(':'))
    {
        controlString = controlString.Split(':')[1].TrimStart(' ');
    }
    return controlString;
}

но вот почему на этой странице так много ответов. Это во многом зависит от того, как вы заполняете поле, как вы можете получить значение из него. Ответ может быть правильным в одном случае и неправильным в другом.


создайте событие ComboBox SelectionChanged и установите ItemsSource= " {Binding}"в дизайне WPF:

код:

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string ob = ((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();
    MessageBox.Show(ob);
}

Как вариант в ComboBox SelectionChanged обработчик событий:

private void ComboBoxName_SelectionChanged(object send ...
{
    string s = ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();
}

MsgBox(cmbCut.SelectedValue().ToString())

у меня была аналогичная проблема и я попробовал ряд решений, предложенных в этом потоке, но обнаружил, что событие SelectionChanged запускалось до того, как элемент ComboBox фактически обновился, чтобы показать новый выбор (т. е. он всегда давал содержимое combobox до изменения).

чтобы преодолеть это, я обнаружил, что лучше использовать параметр e, который автоматически передается обработчику событий, а не пытаться загрузить значение непосредственно из выпадающий список.

XAML:

<Window.Resources>
    <x:Array x:Key="Combo" Type="sys:String">
        <sys:String>Item 1</sys:String>
        <sys:String>Item 2</sys:String>
    </x:Array>
</Window.Resources>
<Grid>
    <ComboBox Name="myCombo" ItemsSource="{StaticResource Combo}" SelectionChanged="ComboBox_SelectionChanged" />
    <TextBlock Name="MyTextBlock"></TextBlock>
</Grid>

C#:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string chosenValue = e.AddedItems[0].ToString();
}

private void usuarioBox_TextChanged(object sender, EventArgs e)
{
    string textComboBox = usuarioBox.Text;
}

чтобы получить значение выбранного индекса ComboBox в C#, используйте:

Combobox.SelectedValue

Это тот же принцип.

вы можете использовать SelectedIndex и использовать ComboBox.Элементы[Свойства SelectedIndex].Метод toString(). Или просто ComboBox.SelectedItem и приведите его к любому типу, который вам нужен:)


На самом деле вы можете сделать это следующим образом.

предположим, что ваше имя ComboBox comboBoxA. Тогда его значение можно получить так:

string combo = comboBoxA.SelectedValue.ToString();

Я думаю, что теперь он поддерживается, так как ваш вопрос пять лет.


написать так:

String CmbTitle = (cmb.SelectedItem as ComboBoxItem).Content.ToString()

XAML:

<ComboBox Height="23" HorizontalAlignment="Left" Margin="19,123,0,0" Name="comboBox1" VerticalAlignment="Top" Width="33" ItemsSource="{Binding}" AllowDrop="True" AlternationCount="1">
    <ComboBoxItem Content="1" Name="ComboBoxItem1" />
    <ComboBoxItem Content="2" Name="ComboBoxItem2" />
    <ComboBoxItem Content="3" Name="ComboBoxItem3" />
</ComboBox>

C#:

if (ComboBoxItem1.IsSelected)
{
    // Your code
}
else if (ComboBoxItem2.IsSelected)
{
    // Your code
}
else if(ComboBoxItem3.IsSelected)
{
    // Your code
}

Я использую этот код, и это работает для меня:

DataRowView typeItem = (DataRowView)myComboBox.SelectedItem; 
string value = typeItem.Row[0].ToString();

это работает для меня:

System.Data.DataRowView typeItem = (System.Data.DataRowView)ComboBoxName.SelectedItem;
string value = typeItem.DataView.ToTable("a").Rows[0][0].ToString();