2010-09-23 15 views
12

io sono abituato a fare le cose comeWPF valore combobox e visualizzazione del testo

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

Dove Stato è una casella di riepilogo in ASP.NET.

Come ottengo lo stesso con un ComboBox WPF? Vedo una proprietà denominata "Contenuto" nell'oggetto ComboBoxItem ma come posso assegnare a ciascun articolo un valore diverso da quello visualizzato all'utente? Per favore aiuto.

+0

cioè: un valore int –

risposta

1

Se si salta il valore, quindi penso che sia abbastanza semplice per aggiungere un nuovo elemento in una casella combinata durante il runtime.

comboBox1.Items.Add("SomeText"); 

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

La proprietà SelectedIndex è impostato su Items.Count-1 in modo che la voce appena aggiunta appare nella casella combinata come l'elemento selezionato.

15

WPF Combobox ha:

  • SelectedValuePath proprietà che specifica il percorso della proprietà che viene utilizzato per determinare il valore della proprietà SelectedValue . E 'simile a Value proprietà ASP.NET ListItem s'.
  • DisplayMemberPath proprietà che definisce un modello predefinito che descrive come visualizzare gli oggetti dati. È simile alla proprietà Text di ASP.NET.

Diciamo che si desidera che il Combobox per mostrare una raccolta dei seguenti KeyValuePair oggetti:

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"), 
}; 

si definisce una proprietà nel modello di vista di ritorno che la raccolta:

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

Poi, il tuo XAML per il Combobox sarà:

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

Dove si impostano le proprietà SelectedValuePath e DisplayMemberPath con i nomi proprietà desiderati degli oggetti (Key e Value corrispondentemente) visualizzati da Combobox.

Oppure, se si desidera davvero aggiungere elementi a Combobox nel codice dietro anziché utilizzare un'associazione, è possibile farlo anche.Per esempio:

<!--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

Se si desidera solo esporre una semplice proprietà del ViewModel e gestire il testo per le scelte in vista che si può fare una soluzione semplice come questo:

<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> 

Esempio con una proprietà bool:

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

alternative Tipo-verbose (esempi originali)

Di seguito sono elencate altre alternative più dettagliate in cui i tipi sono esplicitamente dichiarati. A seconda del tuo stile preferito (o forse alcuni tipi che lo richiedono), forse ti si addice meglio.

<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> 

Esempio con una proprietà 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> 

Lo spazio dei nomi SYS è dichiarato come questa:

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

grande esempio con il booleano. proprio quello di cui avevo bisogno. Anche a me non piace mettere tutte le stringhe UI disponibili (da selezionare da) nel mio viewmodel, le voglio solo in XAML. – Fredrik

+1

perché non Tag = "True"? – dovid

+1

@dovid grazie per il suggerimento, ho provato e funziona. Ho aggiornato la mia risposta con esempi semplificati, ma mantenendo anche i vecchi esempi in caso di necessità per casi angolari. – TGasdf