2012-09-23 8 views
12

En mi aplicación WPF, tengo un cuadro combinado que está lleno de una lista estática de ComboBoxItems debido a su contenido nunca cambiarán. Sin embargo, porque quiero DataBind el SelectedItem a mi modelo de vista subyacente, deseo que cada ComboBoxItem que también tienen un valor separado que se va a asignar a mi propiedad ViewModel. Y estoy teniendo un poco de problema para hacer que esto funcione.ComboBox WPF: lista estática de ComboBoxItems, pero SelectedItem enlace de datos?

Mi declaración ComboBox se parece a:

<ComboBox Height="23" HorizontalAlignment="Stretch" Margin="2" Name="comboBox1" VerticalAlignment="Top" 
       SelectedItem="{Binding Path=Amount, Mode=TwoWay}" SelectedValuePath="Tag" > 
     <ComboBoxItem Content="None" Tag="0" /> 
     <ComboBoxItem Content="Few" Tag="1" /> 
     <ComboBoxItem Content="Some" Tag="2" /> 
     <ComboBoxItem Content="Enough" Tag="3" /> 
     <ComboBoxItem Content="Lots" Tag="4" /> 
     <ComboBoxItem Content="Too much" Tag="5" /> 
    </ComboBox> 

El SelectedItem de este cuadro combinado se une a la propiedad Monto del modelo de vista, que se declara como un entero:

public class MyViewModel : INotifyPropertyChanged 
{ 
    private int _amount = 3; 

    public int Amount 
    { 
     get { return _amount; } 
     set 
     { 
      _amount = value; 
      OnPropertyChanged("Amount"); 
     } 
    } 

    //... 
} 

Yo esperaba que SelectedValuePath = "Tag" diría WPF que debe utilizar el valor de la etiqueta de obligar a la propiedad Monto del modelo de vista, pero cuando corro esta aplicación y cambiar el elemento seleccionado del cuadro combinado, el seguimiento de depuración me dice:

System.Windows.Data Error: 23 : Cannot convert 'System.Windows.Controls.ComboBoxItem: Some' from type 'ComboBoxItem' to type 'System.Int32' for 'en-US' culture ... 
System.Windows.Data Error: 7 : ConvertBack cannot convert value 'System.Windows.Controls.ComboBoxItem: Some' (type 'ComboBoxItem'). (...) System.NotSupportedException: Int32Converter cannot convert from System.Windows.Controls.ComboBoxItem. 

Al parecer, se trata de obligar a todo el ComboBoxItem a mi modelo de vista, no sólo su valor de la etiqueta. ¿Qué estoy haciendo mal?

Respuesta

14

Si utiliza SelectedValuePath entonces usted necesita para unirse a la propiedad SelectedValue que es

Obtiene o establece el valor de la SelectedItem, obtenida mediante el uso de SelectedValuePath

Así modificar su unión a

SelectedValue="{Binding Path=Amount, Mode=TwoWay}" 

porque como experimentó el SelectedItem siempre contai n el elemento realmente seleccionado (en su caso, el ComboBoxItem) no el valor.

+0

Wow, eso fue fácil ... Además, ahora 'mensaje' que hice mal. ¡Gracias por tu explicación! – Astrotrain

Cuestiones relacionadas