2010-09-23 26 views
12

estoy acostumbrado a hacer las cosas comoWPF valor de cuadro combinado y visualización de texto

State.Items.Add(new ListItem { Text = "SomeState", Value = NumericIDofState }); 

Dónde Estado es un cuadro de lista en ASP.NET.

¿Cómo consigo lo mismo con un WPF ComboBox? Veo una propiedad llamada 'Contenido' en el objeto ComboBoxItem, pero ¿cómo le asigno a cada elemento un valor diferente al que se muestra al usuario? Por favor ayuda.

+0

es decir: un valor int –

Respuesta

1

Si se salta el valor, entonces yo creo que es bastante fácil de añadir un nuevo elemento en un ComboBox en tiempo de ejecución.

comboBox1.Items.Add("SomeText"); 

comboBox1.SelectedIndex = comboBox1.Items.Count - 1; 

La propiedad SelectedIndex se establece en Items.Count-1 de modo que el elemento recién añadido aparece en el cuadro combinado como el elemento seleccionado.

15

WPF Combobox tiene:

  • SelectedValuePath propiedad que especifica la ruta de acceso a la propiedad que se utiliza para determinar el valor de la propiedad SelectedValue . Es similar a ASP.NET ListItem 's Value propiedad.
  • DisplayMemberPath propiedad que define una plantilla predeterminada que describe cómo mostrar los objetos de datos. Es similar a la propiedad ListItem de ASP.NET Text.

Digamos que usted quiere que su Combobox para mostrar una colección de los KeyValuePair objetos siguientes:

private static readonly KeyValuePair<int, string>[] tripLengthList = { 
    new KeyValuePair<int, string>(0, "0"), 
    new KeyValuePair<int, string>(30, "30"), 
    new KeyValuePair<int, string>(50, "50"), 
    new KeyValuePair<int, string>(100, "100"), 
}; 

Se define una propiedad en su modelo de vista devolver esa colección:

public KeyValuePair<int, string>[] TripLengthList 
{ 
    get 
    { 
     return tripLengthList; 
    } 
} 

Entonces, su XAML para el Combobox sería:

<ComboBox 
    SelectedValue="{Binding FilterService.TripLengthFrom, Mode=TwoWay}" 
    ItemsSource="{Binding TripLengthList, Mode=OneTime}" 
    SelectedValuePath="Key" 
    DisplayMemberPath="Value" /> 

Cuando se establece SelectedValuePath y DisplayMemberPath propiedades a los nombres de las propiedades deseadas de los objetos (Key y Value correspondientemente) que muestran por el Combobox.

O, si realmente desea agregar elementos a Combobox en el código detrás de en lugar de usar un enlace, puede hacerlo también.Por ejemplo:

<!--XAML--> 
<ComboBox x:Name="ComboBoxFrom" 
    SelectedValue="{Binding FilterService.TripLengthFrom, Mode=TwoWay}" /> 

// Code behind 
public partial class FilterView : UserControl 
{ 
    public FilterView() 
    { 
     this.InitializeComponent(); 

     this.ComboBoxFrom.SelectedValuePath = "Key"; 
     this.ComboBoxFrom.DisplayMemberPath = "Value"; 
     this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(0, "0")); 
     this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(30, "30")); 
     this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(50, "50")); 
     this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(100, "100")); 
    } 
10

Si sólo desea exponer una simple propiedad en el modelo de vista y tratar el texto de las opciones en la vista que se puede hacer una solución simple como esto:

<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding YourIntProperty, Mode=TwoWay}"> 
     <ComboBoxItem Content="First choice" Tag="0"/> 
     <ComboBoxItem Content="Second choice" Tag="1"/> 
     <ComboBoxItem Content="Third choice" Tag="2"/> 
    </ComboBox> 

Ejemplo con una propiedad bool:

<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding IsActive, Mode=TwoWay}"> 
     <ComboBoxItem Content="No" Tag="False"/> 
     <ComboBoxItem Content="Yes" Tag="True"/> 
    </ComboBox> 

alternativas Tipo-prolijo (ejemplos originales)

A continuación hay más alternativas detalladas donde los tipos se declaran explícitamente. Dependiendo de su estilo preferido (o tal vez algunos tipos que lo requieran), tal vez le conviene más.

<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding YourIntProperty, Mode=TwoWay}"> 
    <ComboBoxItem Content="First choice"> 
     <ComboBoxItem.Tag> 
      <sys:Int32>0</sys:Int32> 
     </ComboBoxItem.Tag> 
    </ComboBoxItem> 
    <ComboBoxItem Content="Second choice"> 
     <ComboBoxItem.Tag> 
      <sys:Int32>1</sys:Int32> 
     </ComboBoxItem.Tag> 
    </ComboBoxItem> 
    <ComboBoxItem Content="Third choice"> 
     <ComboBoxItem.Tag> 
      <sys:Int32>2</sys:Int32> 
     </ComboBoxItem.Tag> 
    </ComboBoxItem> 
</ComboBox> 

Ejemplo con una propiedad bool:

<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding IsActive, Mode=TwoWay}"> 
    <ComboBoxItem Content="No"> 
     <ComboBoxItem.Tag> 
      <sys:Boolean>False</sys:Boolean> 
     </ComboBoxItem.Tag> 
    </ComboBoxItem> 
    <ComboBoxItem Content="Yes"> 
     <ComboBoxItem.Tag> 
      <sys:Boolean>True</sys:Boolean> 
     </ComboBoxItem.Tag> 
    </ComboBoxItem> 
</ComboBox> 

El espacio de nombres sys se declara como este:

xmlns:sys="clr-namespace:System;assembly=mscorlib" 
+1

gran ejemplo con el booleano. justo lo que necesitaba. tampoco me gusta poner todas las cadenas de UI disponibles (para seleccionar) en mi modelo de vista, solo las quiero en el XAML. – Fredrik

+1

¿por qué no Tag = "True"? – dovid

+1

@dovid gracias por la sugerencia, probé y funciona. He actualizado mi respuesta con ejemplos simplificados, pero manteniendo los ejemplos anteriores también en caso de que sea necesario para casos de esquina. – TGasdf

Cuestiones relacionadas