2012-07-23 28 views
5

Ich habe eine einfache ComboBox, die jedes Mal, wenn sich der ausgewählte Wert ändert, separate Befehle auslösen soll. Hier ist ein Beispiel für meine Markup:Befehle an ComboBoxItem in WPF binden

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

Ich erhalte eine Fehlermeldung, „nicht‚SelectViewFeedDataCommand‘ konvertieren kann“. Ich bekomme einen ähnlichen Fehler für das andere ComboBoxItem. Der ICommand ist in der ViewModel-Klasse definiert, bei der es sich um die DataSource für das UserControl handelt, die als DataTemplate gebunden ist.

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

Ich habe dies ziemlich intensiv recherchiert, aber keine Antwort, wie man effektiv binden die ICommand an den ComboBoxItem gefunden.

Ich passe dies aus bestehenden Code, der eine Reihe von Radiobuttons und zugehörige Befehle verwendet, was ziemlich einfach gemacht wird. Gibt es keine einfache Möglichkeit, dies mit einer ComboBox zu tun?

Danke.

+1

Was ist die 'ComboBox.SelectedItem' Eigenschaft, um etwas zu binden, dann in der' PropertyChanged' Veranstaltung Ihrer SelectedComboBoxItem Eigenschaft Ihre Befehlslogik zu tun? – Rachel

Antwort

0

Ich schaute auf meine alten Beiträge und erkannte, dass ich die Lösung meiner Frage nie gepostet habe ... ziemlich einfach (wenn nicht elegant). Ich habe gerade eine Liste in meinem Ansichtsmodell erstellt, die meine Combo Box „Auswahl“ enthalten ist und dann, wenn die SelectedValue geändert wurde, löste meine „geändert“ Logik in dem Setter für die Eigenschaft:

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

Und aus dem Sicht-Modell :

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

      //additional code to perform here 

     } 
    } 
0

Haben Sie versucht, den Befehl an eine Bindung zu übergeben?

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

Edit für aktualisierte Strategie:

Da der ComboBox Artikel unterstützen den direkten Befehl zu binden, versucht nicht, eine angefügte Eigenschaft zu erstellen:

Link

+0

Ja, habe ich. Ich erhalte eine Fehlermeldung: "Eine 'Bindung' kann nicht für die Eigenschaft 'Command' des Typs 'CommandBinding' festgelegt werden. Eine 'Bindung' kann nur für eine DependencyProperty eines DependencyObject gesetzt werden." – jpaull

Verwandte Themen