2009-12-16 3 views
10

Sul mio viewmodel ho una proprietà int e voglio esporla per la modifica con un ComboBox, con un insieme limitato di scelte, come 16, 8, 4 e 2. C'è un modo per specificare le scelte in XAML, mentre ancora legano il valore al viewmodel? Che avrei voluto fare qualcosa di simile:ComboBox WPF associato a dati con scelte definite in XAML?

<ComboBox SelectedValue="{Binding MyIntProperty}"> 
    <ComboBoxItem>16</ComboBoxItem> 
    <ComboBoxItem>8</ComboBoxItem> 
    <ComboBoxItem>4</ComboBoxItem> 
    <ComboBoxItem>2</ComboBoxItem> 
</ComboBox> 

So che avrei potuto mettere su un List<int> nel codice e impostare che come ItemsSource, ma spero ci sia un modo per fare questo che non comporta una proprietà aggiuntiva nel viewmodel che espone una collezione creata nel codice.

risposta

13

È possibile specificare le proprie scelte esattamente come nel proprio esempio. Quello che sembra il tuo mancante, per farlo funzionare, è la proprietà SelectedValuePath. Senza di esso, SelectedValue sarebbe uguale a SelectedItem. Impostando SelectedValuePath = "Contenuto" nel ComboBox è possibile specificare che il binding SelectedValue si leghi invece solo a una porzione di SelectedItem, in questo caso il contenuto Int specificato come contenuto in ciascun oggetto ComboBox.

Ecco una piccola demo con esso, e anche il valore vincolante a un TextBox, in cui è possibile impostare l'elemento e vederlo riflesso nel ComboBox tramite il binding SelectedValue (o viceversa).

<StackPanel> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="Set Value:" /> 
     <TextBox Text="{Binding MyIntProperty, UpdateSourceTrigger=PropertyChanged}" /> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="Select Value:" /> 
     <ComboBox SelectedValue="{Binding MyIntProperty}" SelectedValuePath="Content"> 
      <ComboBoxItem>2</ComboBoxItem> 
      <ComboBoxItem>4</ComboBoxItem> 
      <ComboBoxItem>6</ComboBoxItem> 
      <ComboBoxItem>8</ComboBoxItem> 
      <ComboBoxItem>16</ComboBoxItem> 
     </ComboBox> 
    </StackPanel> 
</StackPanel> 
+0

Ahh grazie. Avevo effettivamente provato quella cosa ma pensavo che non funzionasse perché la mia proprietà non era ancora stata impostata. Comunque, è bello avere questa risposta esplicitamente là fuori come non riuscivo a trovarla durante la ricerca. – RandomEngy