2012-07-23 18 views
5

Ho un semplice ComboBox che voglio attivare comandi separati ogni volta che cambia il valore selezionato. Ecco un esempio del mio markup:Binding Comandi a ComboBoxItem in WPF

<WrapPanel Grid.Row="0" Visibility="{Binding ShowToggleViewFeedViewManual}"> 
    <ComboBox Margin="3,3,0,0"> 
     <ComboBoxItem IsEnabled="{Binding CanSelectViewFeedData}" > 
      <ComboBoxItem.CommandBindings> 
       <CommandBinding Command="SelectViewFeedDataCommand" /> 
      </ComboBoxItem.CommandBindings> 
      <TextBlock Text="View Feed Data"/> 
     </ComboBoxItem> 
     <ComboBoxItem IsEnabled="{Binding CanSelectViewManualData}"> 
      <ComboBoxItem.CommandBindings> 
       <CommandBinding Command="SelectManualFeedDataCommand" /> 
      </ComboBoxItem.CommandBindings> 
      <TextBlock Text="View Manual Data"/> 
     </ComboBoxItem> 
    </ComboBox> 
</WrapPanel> 

ottengo un errore "Impossibile convertire 'SelectViewFeedDataCommand'". Ottengo un errore simile anche per l'altro ComboBoxItem. ICommand è definito nella classe ViewModel che è il DataSource per UserControl, associato come DataTemplate.

public ICommand SelectViewFeedDataCommand 
{ 
    get 
    { 
     // Code to perform 
    } 
} 

Ho ricercato questo abbastanza ampiamente, ma non ho trovato una risposta per come associare efficacemente l'ICommand al ComboBoxItem.

Sto adattando questo codice esistente che utilizzava una serie di pulsanti di opzione e comandi associati, il che è fatto abbastanza facilmente. Non c'è un modo semplice per farlo con un ComboBox?

Grazie.

+1

Che dire vincolante la proprietà 'ComboBox.SelectedItem' a qualcosa, poi facendo la logica di comando nel' evento PropertyChanged' della vostra proprietà SelectedComboBoxItem? – Rachel

risposta

0

stavo guardando i miei vecchi post e ho capito che non ho mai postato la soluzione alla mia domanda ... piuttosto semplice davvero (se non elegante). Ho appena creato un elenco nel mio ViewModel che conteneva i miei "scelte" Casella combinata e poi, quando il SelectedValue è stato cambiato, innescato la mia logica "cambiato" nel setter per la proprietà:

<WrapPanel Grid.Row="0" Visibility="{Binding ShowToggleFeedViewManual}" > 
    <ComboBox Margin="10,10,10,10" Width="200" ItemsSource="{Binding AvailableDataSources}" SelectedValue="{Binding SelectedDataSource}"/> 
</WrapPanel> 

E dal-modello di vista :

public FeedSource SelectedDataSource 
    { 
     get { return _selectedDataSource; } 
     set 
     { 
      _selectedDataSource = value; 
      base.OnPropertyChanged("SelectedDataSource"); 

      //additional code to perform here 

     } 
    } 
0

Hai provato a mettere il comando su un binding?

<CommandBinding Command="{Binding SelectManualFeedDataCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" /> 

Modifica per la strategia di aggiornamento:

Dal momento che l'oggetto ComboBox non supporta il comando diretto vincolante, provare a creare una proprietà allegato:

Link

+0

Sì, ho. Viene visualizzato un messaggio di errore: "Non è possibile impostare A" Binding "sulla proprietà" Command "di tipo" CommandBinding ". Un" Binding "può essere impostato solo su DependencyProperty di DependencyObject." – jpaull