from - Obtener el valor seleccionado del cuadro combinado en C#WPF
wpf combobox selectionchanged (20)
Acabo de empezar a usar formularios WPF en lugar de formularios de Windows Forms. En un formulario de Windows Forms, podría hacer lo siguiente:
ComboBox.SelectedValue.toString();
Y esto funcionaría bien.
¿Cómo hago esto en WPF? No parece tener la opción.
Asegúrese de haber establecido el nombre de su ComboBox en su archivo XAML:
<ComboBox Height="23" Name="comboBox" />
En su código, puede acceder al elemento seleccionado utilizando la propiedad SelectedItem
:
MessageBox.Show(comboBox.SelectedItem.ToString());
Bueno ... Encontré una solución más simple.
String s = comboBox1.Text;
De esta manera obtengo el valor seleccionado como cadena.
Como una variante en el controlador de eventos ComboBox SelectionChanged
:
private void ComboBoxName_SelectionChanged(object send ...
{
string s = ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();
}
Cree un evento de Selección de ComboBox y configure ItemsSource = "{Binding}" en el diseño de WPF:
Código:
private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string ob = ((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();
MessageBox.Show(ob);
}
Depende de lo que vincule a su ComboBox. Si ha vinculado un objeto llamado MyObject y tiene, digamos, una propiedad llamada Nombre, haga lo siguiente:
MyObject mo = myListBox.SelectedItem as MyObject;
return mo.Name;
En realidad, puedes hacerlo de la siguiente manera también.
Supongamos que su nombre ComboBox es comboBoxA
. Entonces su valor puede obtenerse como:
string combo = comboBoxA.SelectedValue.ToString();
Creo que ahora es compatible ya que su pregunta tiene cinco años.
Es el mismo principio.
Puede usar SelectedIndex y usar ComboBox.Items [SelectedIndex] .ToString (). O solo ComboBox.SelectedItem y echándolo al tipo que necesite :)
Escríbelo así:
String CmbTitle = (cmb.SelectedItem as ComboBoxItem).Content.ToString()
Esto depende en gran medida de cómo se llena la caja. Si se hace adjuntando una DataTable
(u otra colección) a ItemsSource
, puede encontrar adjuntar un manejador de evento SelectionChanged
a su caja en el XAML y luego usar esto en el código subyacente útil:
private void ComboBoxName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox cbx = (ComboBox)sender;
string s = ((DataRowView)cbx.Items.GetItemAt(cbx.SelectedIndex)).Row.ItemArray[0].ToString();
}
Vi otras 2 respuestas aquí que tenían diferentes partes de eso: una tenía ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();
, que tiene un aspecto similar pero que no arroja la caja a DataRowView
, algo que descubrí que necesitaba hacer, y otro: ((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();
, usó .SelectedItem
lugar de .Items.GetItemAt(comboBox1.SelectedIndex)
. Eso podría haber funcionado, pero lo que establecí fue en realidad la combinación de los dos que escribí arriba, y no recuerdo por qué evité .SelectedItem
excepto que no debería haber funcionado para mí en este escenario.
Si está llenando la casilla dinámicamente o con elementos de ComboBoxItem
en el menú desplegable directamente en el XAML, este es el código que uso:
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());
}
Verás que tengo cboParser
, allí. Esto se debe a que el resultado de SelectedValue
tiene el siguiente aspecto: System.Windows.Controls.Control: Some Value
. Al menos lo hizo en mi proyecto. Así que tienes que analizar tu Some Value
agregado de eso:
private static string cboParser(string controlString)
{
if (controlString.Contains('':''))
{
controlString = controlString.Split('':'')[1].TrimStart('' '');
}
return controlString;
}
Pero esta es la razón por la cual hay tantas respuestas en esta página. En gran medida, depende de cómo llene la caja, de cómo puede recuperar el valor. Una respuesta puede ser correcta en una circunstancia, y errónea en la otra.
Esto funciona para mi:
System.Data.DataRowView typeItem = (System.Data.DataRowView)ComboBoxName.SelectedItem;
string value = typeItem.DataView.ToTable("a").Rows[0][0].ToString();
Me he dado cuenta de una forma un poco extraña de hacerlo en comparación con las viejas formas de WF:
ComboBoxItem typeItem = (ComboBoxItem)cboType.SelectedItem;
string value = typeItem.Content.ToString();
Mi XAML es como a continuación:
<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>
El contenido se muestra como texto y el nombre del combobox de WPF. Para obtener el nombre del elemento seleccionado, he seguido esta línea de código:
ComboBoxItem ComboItem = (ComboBoxItem)cmbDeviceDefinitionId.SelectedItem;
string name = ComboItem.Name;
Para obtener el texto seleccionado de un combobox de WPF:
string name = cmbDeviceDefinitionId.SelectionBoxItem.ToString();
Para obtener el valor del índice seleccionado de ComboBox en C # use:
Combobox.SelectedValue
Que tal esto:
string yourstringname = (yourComboBox.SelectedItem as ComboBoxItem).Content.ToString();
Resolver este problema es simple. Todo lo que hice fue agregar "SelectedValuePath" a mi código XAML y vincularlo a la propiedad de mi modelo que quiero devolver con el cuadro combinado.
<ComboBox SelectedValuePath="_Department"
DisplayMemberPath="_Department"
Height="23"
HorizontalAlignment="Left"
ItemsSource="{Binding}"
Margin="-58,1,0,5"
Name="_DepartmentComboBox"
VerticalAlignment="Center"
Width="268"/>
Tuve un problema similar e intenté una serie de soluciones sugeridas en este hilo, pero descubrí que el evento SelectionChanged se estaba disparando antes de que el elemento ComboBox se hubiera actualizado para mostrar la nueva selección (es decir, siempre daba los contenidos del combobox antes del cambio) ocurriendo).
Para superar esto, descubrí que era mejor usar el parámetro e que se pasa automáticamente al controlador de eventos en lugar de intentar cargar el valor directamente desde el cuadro combinado.
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>
DO#:
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string chosenValue = e.AddedItems[0].ToString();
}
Uso este código, y funciona para mí:
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>
DO#:
if (ComboBoxItem1.IsSelected)
{
// Your code
}
else if (ComboBoxItem2.IsSelected)
{
// Your code
}
else if(ComboBoxItem3.IsSelected)
{
// Your code
}
MsgBox(cmbCut.SelectedValue().ToString())
private void usuarioBox_TextChanged(object sender, EventArgs e)
{
string textComboBox = usuarioBox.Text;
}