2010-09-23 16 views
12

jestem przyzwyczajony do robienia rzeczy jakWPF wartość combobox i wyświetlacz tekstowy

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

Gdzie państwo jest listbox w ASP.NET.

Jak osiągnąć to samo z WPF ComboBox? Widzę właściwość o nazwie "Treść" w obiekcie ComboBoxItem, ale w jaki sposób przypisać każdej pozycji wartość inną niż wyświetlana użytkownikowi? Proszę pomóż.

+0

tj: niektóre int wartość –

Odpowiedz

1

Jeśli pominąć wartość, to myślę, że jest to dość proste, aby dodać nowy element do ComboBox podczas wykonywania.

comboBox1.Items.Add("SomeText"); 

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

Obiekt SelectedIndex jest ustawiony na Items.Count-1 tak, że nowo dodany element pojawia się w ComboBox jako wybranego elementu.

15

WPF Combobox posiada:

  • SelectedValuePath właściwość, która określa ścieżkę do nieruchomości , który jest używany do określenia wartości nieruchomości SelectedValue . Jest podobna do właściwości ASP.NET ListItem o nazwie Value. Właściwość definiująca domyślny szablon określający sposób wyświetlania obiektów danych. Jest podobna do właściwości ASP.NET ListItem o nazwie Text.

Powiedzmy chcesz swój Combobox aby pokazać zbiór następujących KeyValuePair obiektów:

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

zdefiniować właściwość w widoku modelu powrocie tej kolekcji:

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

Następnie Twój XAML dla Combobox będzie:

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

Gdzie ustawia się właściwości SelectedValuePath i na żądane nazwy właściwości obiektów (odpowiednio) (Key i Value) wyświetlane przez Combobox.

Lub, jeśli naprawdę chcesz dodać elementy do Combobox w kodzie za zamiast używać wiązania, możesz to zrobić również.Na przykład:

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

Jeśli chcesz tylko wystawiać prosty właściwość w viewmodel i obsługiwać tekst wyborów w widoku można zrobić proste rozwiązanie takiego:

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

Przykład z właściwość bool:

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

typu gadatliwy alternatywy (oryginalne przykłady)

Poniżej znajdują się bardziej szczegółowe alternatywy, w których typy są jawnie zadeklarowane. W zależności od preferowanego stylu (lub niektórych typów, które tego wymagają), może lepiej Ci pasuje.

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

Przykład z nieruchomości 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> 

Przestrzeń nazw sys jest zadeklarowana jako to:

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

doskonałym przykładem z logiczną. dokładnie to, czego potrzebowałem. Ja też nie lubię umieścić wszystkie dostępne ciągi UI (do wyboru) w moim viewmodel, chcę je tylko w XAML. – Fredrik

+1

dlaczego nie Tag = "True"? – dovid

+1

@ dziękuję za sugestię, przetestowałem i działa. Zaktualizowałem swoją odpowiedź za pomocą uproszczonych przykładów, ale zachowując stare przykłady również w przypadku przypadków narożnych. – TGasdf