Я только начал использовать формы WPF вместо форм Windows Forms. В форме Windows Forms я мог бы просто сделать:
ComboBox.SelectedValue.toString();
И это будет нормально работать.
Как мне сделать это в WPF? Похоже, что нет возможности.
Я только начал использовать формы WPF вместо форм Windows Forms. В форме Windows Forms я мог бы просто сделать:
ComboBox.SelectedValue.toString();
И это будет нормально работать.
Как мне сделать это в WPF? Похоже, что нет возможности.
Я понял немного странный способ сделать это по сравнению со старыми формами WF:
ComboBoxItem typeItem = (ComboBoxItem)cboType.SelectedItem;
string value = typeItem.Content.ToString();
Хорошо.. Я нашел более простое решение.
String s = comboBox1.Text;
Таким образом, я получаю выбранное значение как строку.
Убедитесь, что вы указали имя своего 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. Чтобы получить название выбранного элемента, я должен следовать этой строке кода:
ComboBoxItem ComboItem = (ComboBoxItem)cmbDeviceDefinitionId.SelectedItem;
string name = ComboItem.Name;
Чтобы получить выделенный текст в выпадающем списке WPF:
string name = cmbDeviceDefinitionId.SelectionBoxItem.ToString();
Это зависит от того, что вы связали с вашим ComboBox. Если вы связали объект с именем MyObject и имеете, допустим, свойство Name, сделайте следующее:
MyObject mo = myListBox.SelectedItem as MyObject;
return mo.Name;
Как насчет этих:
string yourstringname = (yourComboBox.SelectedItem as ComboBoxItem).Content.ToString();
Решить эту проблему просто. Все, что я сделал, это добавил "SelectedValuePath" в мой код XAML и привязал его к свойству модели, которое я хочу вернуть с помощью комбинированного списка.
<ComboBox SelectedValuePath="_Department"
DisplayMemberPath="_Department"
Height="23"
HorizontalAlignment="Left"
ItemsSource="{Binding}"
Margin="-58,1,0,5"
Name="_DepartmentComboBox"
VerticalAlignment="Center"
Width="268"/>
Как вариант в обработчике событий ComboBox SelectionChanged
:
private void ComboBoxName_SelectionChanged(object send ...
{
string s = ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();
}
Создайте событие 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);
}
Это во многом зависит от того, как заполняется ящик. Если это делается путем присоединения 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();
}
Я видел еще два ответа, которые имели разные части: у одного был 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;
}
Но вот почему на этой странице так много ответов. Это во многом зависит от того, как вы заполняете окно, о том, как вы можете вернуть стоимость. Ответ может быть правильным в одном случае, а в другом - неправильным.
У меня была аналогичная проблема и я попробовал ряд решений, предложенных в этом потоке, но обнаружил, что событие SelectionChanged запускалось до того, как элемент 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>
С#:
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;
}
Это тот же принцип.
Вы можете использовать SelectedIndex и ComboBox.Items [SelectedIndex].ToString(). Или просто ComboBox.SelectedItem и приведите его к любому типу вам нужно :)
MsgBox(cmbCut.SelectedValue().ToString())
Чтобы получить значение выбранного индекса ComboBox в С#:
Combobox.SelectedValue
На самом деле вы можете сделать это следующим образом.
Предположим, ваше имя ComboBox comboBoxA
. Тогда его значение может быть получено как:
string combo = comboBoxA.SelectedValue.ToString();
Я думаю, что теперь это поддерживается, поскольку вашему вопросу пять лет.
Напишите это так:
String CmbTitle = (cmb.SelectedItem as ComboBoxItem).Content.ToString()
если вы хотите получить значение и проверить его, вы можете сделать что-то вроде этого
string index = ComboBoxDB.Text;
if (index.Equals(""))
{
MessageBox.Show("your message");
}
else
{
openFileDialog1.ShowDialog();
string file = openFileDialog1.FileName;
reader = new StreamReader(File.OpenRead(file));
}
Я использую этот код, и он работает для меня:
DataRowView typeItem = (DataRowView)myComboBox.SelectedItem;
string value = typeItem.Row[0].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>
С#:
if (ComboBoxItem1.IsSelected)
{
// Your code
}
else if (ComboBoxItem2.IsSelected)
{
// Your code
}
else if(ComboBoxItem3.IsSelected)
{
// Your code
}
Это работает для меня:
System.Data.DataRowView typeItem = (System.Data.DataRowView)ComboBoxName.SelectedItem;
string value = typeItem.DataView.ToTable("a").Rows[0][0].ToString();