2010-09-23 10 views
12

ich zu tun Dinge verwendet wieWPF combobox Wert und Anzeigetext

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

Wo Staat eine Listbox in ASP.NET ist.

Wie erreiche ich dasselbe mit einer WPF ComboBox? Ich sehe eine Eigenschaft mit dem Namen "Content" im ComboBoxItem-Objekt, aber wie kann ich jedem Element einen anderen Wert als dem Benutzer zuweisen? Bitte helfen Sie.

+0

heißt: einige int Wert –

Antwort

1

Wenn Sie den Wert überspringen, dann denke ich, es ist ganz einfach ein neues Element in eine ComboBox während der Laufzeit hinzuzufügen.

comboBox1.Items.Add("SomeText"); 

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

Die SelectedIndex Eigenschaft auf Items.Count-1, so dass die neu hinzugefügte Element in der ComboBox als das ausgewählte Element angezeigt.

15

WPF Combobox hat:

  • SelectedValuePath Eigenschaft, die den Pfad zu der Eigenschaft gibt, die den Wert der SelectedValue Eigenschaft zu bestimmen, verwendet wird. Es ist ähnlich der Eigenschaft von ASP.NET ListItemValue.
  • DisplayMemberPath Eigenschaft, die eine Standardvorlage definiert, die beschreibt, wie die Datenobjekte angezeigt werden. Es ist vergleichbar mit der Eigenschaft ListItem von Text.

Angenommen, Sie möchten Ihre Combobox eine Sammlung der folgenden KeyValuePair Objekte zeigen:

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

Sie definieren eine Eigenschaft Ihrer Ansicht nach Modell, dass die Sammlung der Rückkehr:

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

Dann Ihr XAML für die Combobox wäre:

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

Wo Sie SelectedValuePath und DisplayMemberPath Eigenschaften auf die gewünschten Eigenschaftsnamen der Objekte (Key und Value entsprechend) Anzeigen durch die Combobox eingestellt.

Oder, wenn Sie wirklich Elemente zu Combobox in Code hinter hinzufügen möchten anstatt eine Bindung zu verwenden, können Sie es auch tun.Zum Beispiel:

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

Wenn Sie nur eine einfache Eigenschaft in dem Viewmodel und behandeln Sie den Text für die Entscheidungen in der Ansicht verfügbar machen möchten können Sie eine einfache Lösung wie folgt tun:

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

Beispiel mit ein Bool Eigenschaft:

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

Typ-ausführliche Alternativen (original Beispiele)

Im Folgenden finden Sie ausführlichere Alternativen, bei denen die Typen explizit deklariert werden. Abhängig von Ihrem bevorzugten Stil (oder vielleicht einigen Arten, die es erfordern), vielleicht passt es Ihnen besser.

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

Beispiel mit einem Bool-Eigenschaft:

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

Das sys-Namensraum wird als dies erklärt:

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

großartiges Beispiel mit dem boolean. genau das, was ich brauchte. Ich mag auch nicht alle verfügbaren UI-Strings (zur Auswahl) in meinem Viewmodel, ich möchte sie nur im XAML. – Fredrik

+1

Warum nicht Tag = "True"? – dovid

+1

@dovid danke für den Vorschlag, ich habe getestet und es funktioniert. Ich habe meine Antwort mit vereinfachten Beispielen aktualisiert, behalte aber die alten Beispiele auch für Fallfälle bei. – TGasdf