2010-02-10 25 views
5

Se me ha confundido al configurar SelectedItem programáticamente en aplicaciones wpf con Net Framework 3.5 sp1 instalado. He leído con cuidado sobre cientos de mensajes \ temas, pero todavía confundidos (( Mi xaml:Establecer programáticamente el elemento seleccionado ComboBox en WPF (3.5sp1)

<ComboBox name="cbTheme"> 
    <ComboBoxItem>Sunrise theme</ComboBoxItem> 
    <ComboBoxItem>Sunset theme</ComboBoxItem> 
</ComboBox> 

Si añado IsSelected = "true" propiedad en uno de los elementos - es conjuntos dosn't selecciona este elemento . ¿por qué y yo era probar diferentes en el código y todavía no puede establecer elemento seleccionado:?

cbTheme.SelectedItem=cbTheme.Items.GetItemAt(1); //dosn't work 
cbTheme.Text = "Sunrise theme"; //dosn't work 
cbTheme.Text = cbTheme.Items.GetItemAt(1).ToString();//dosn't work 
cbTheme.SelectedValue = ...//dosn't work 
cbTheme.SelectedValuePath = .. //dosn't work 
//and even this dosn't work: 
ComboBoxItem selcbi = (ComboBoxItem)cbTheme.Items.GetItemAt(1);//or selcbi = new ComboBoxItem 
cbTheme.SelectedItem = selcbi; 

El SelectedItem no es una propiedad de sólo lectura, así que por qué wa no trabajo creo que eso debería ser de Microsoft? problemas, no mi. O me he perdido algo ??? He intentado p poniendo con ListBox, y todo funciona bien con el mismo código, puedo establecer selecciones, obtener selecciones, etc. ... Entonces, ¿qué puedo hacer con ComboBox? ¿Tal vez algunos trucos?

+0

Hola @Victor debes seleccionar la respuesta de ihatemash – reggaeguitar

Respuesta

0

¿Están vinculados los datos de ComboBox?

Si es así usted es probablemente mejor que hacerlo a través de encuadernación en lugar de código ....

Ver esta pregunta ... WPF ListView Programmatically Select Item

Tal vez crear un nuevo SelectableObject {texto = "ABC Theme", IsCurrentlySelected = True} Enlaza una colección de SelectableObjects en el ComboBox.

Configurando esencialmente la propiedad IsCurrentlySelected en el modelo y teniendo la actualización de UI del Modelo.

4

si añado el cuadro combinado y artículos programación, esto funciona para mí:

ComboBox newCombo = new ComboBox(); 

ComboBoxItem newitem = new ComboBoxItem(); 
newitem.Content = "test 1"; 
newCombo.Items.Add(newitem); 
newitem = new ComboBoxItem(); 
newitem.Content = "test 2"; 
newCombo.Items.Add(newitem); 
newitem = new ComboBoxItem(); 
newitem.Content = "test 3"; 
newCombo.Items.Add(newitem); 

newCombo.SelectedItem = ((ComboBoxItem)newCombo.Items[1]); 
newCombo.Text = ((ComboBoxItem)newCombo.Items[1]).Content.ToString(); 

newStack.Children.Add(newCombo); 

También funciona si se establece la propiedad ItemSource mediante programación, a continuación, establecer el texto al valor seleccionado.

4

crear una propiedad pública en su modelo de vista de la lista de temas y una para el elemento seleccionado:

private IEnumerable<string> _themeList; 
    public IEnumerable<string> ThemeList 
    { 
     get { return _themeList; } 
     set 
     { 
      _themeList = value; 
      PropertyChangedEvent.Notify(this, "ThemeList"); 
     } 
    } 
    private string _selectedItem; 
    public string SelectedItem 
    { 
     get { return _selectedItem; } 
     set 
     { 
      _selectedItem = value; 
      PropertyChangedEvent.Notify(this,"SelectedItem"); 
     }    
    } 

se unen a su cuadro combinado en XAML a las propiedades como esta:

<ComboBox 
     Name="cbTheme" 
     ItemsSource="{Binding ThemeList}"  
     SelectedItem="{Binding SelectedItem}"> 
    </ComboBox> 

ahora todo lo que do es agregar elementos a la lista de temas para rellenar el cuadro combinado. Para seleccionar un elemento de la lista, establezca la propiedad seleccionada para el texto del elemento que desee seleccionado como esto:

var tmpList = new List<string>(); 
    tmpList.Add("Sunrise theme"); 
    tmpList.Add("Sunset theme"); 

    _viewModel.ThemeList = tmpList; 
    _viewModel.SelectedItem = "Sunset theme"; 

o tratar de ajustar el elemento seleccionado para el valor de cadena del elemento que desee seleccionó en su propio código si desea utilizar el código que tiene actualmente; no está seguro si funcionará, pero puede intentarlo.

+0

asegúrate de configurar el elemento de texto de tu vista en cualquier clase que contenga las propiedades ThemeList y SelectedItem, es decir, tu ViewModel. – ihatemash

+2

Esta debería ser la respuesta aceptada, ¡es la única que puede probarse por unidad – reggaeguitar

0

según Respuesta 4

Si ya añadir los elementos en la fuente del artículo. Activa el PropertyChangedEvent del valor seleccionado.

tmpList.Add("Sunrise theme"); 
    tmpList.Add("Sunset theme"); 
    PropertyChangedEvent.Notify(this,"SelectedItem"); 
7

Para seleccionar cualquier elemento de la ComboBox y para establecerlo como elemento predeterminado seleccionado sólo tiene que utilizar la línea de abajo:

combobox.SelectedIndex = 0; //index should be the index of item which you want to be selected 
+0

para mí! –

0

Si conoce el índice del elemento que desea ajustar, en este mayúsculas y parece que está tratando de establecer el índice 1, sólo tiene que hacer:

cbTheme.SelectedIndex = 1; 

he descubierto que cuando no se conoce el índice, que es cuando se tiene el problema real. Sé que esto va más allá de la pregunta original, pero para los empleados de Google que desean saber cómo configurar el elemento cuando no se conoce el índice, pero se conoce el valor que desea mostrar, si está llenando su menú desplegable con un ItemSource desde un DataTable, por ejemplo, se puede conseguir que el índice al hacer esto:

int matchedIndex = 0; 
if (dt != null & dt.Rows != null) 
{ 
    if (dt.Rows.Count > 0) 
    { 
     foreach (DataRow dr in dt.Rows) 
     { 
      string myRowValue = dr["SOME_COLUMN"] != null ? dr["SOME_COLUMN"].ToString() : String.Empty; 
      if (myRowValue == "Value I Want To Set") 
       break; 
      else 
       matchedIndex++; 
     } 
    } 
} 

Y entonces usted simplemente hacer cbTheme.SelectedIndex = matchedIndex;.

A iteración similar de ComboBoxItem artículos en vez de DataRow filas podría producir un resultado similar, si el ComboBox se llenó cómo los espectáculos OP, en lugar.

Cuestiones relacionadas