2012-07-23 16 views
5

Mam prosty ComboBox, który chcę wyzwalać osobne polecenia za każdym razem, gdy zmienia się wybrana wartość. Oto przykład mojego znaczników:Wiązanie poleceń do ComboBoxItem w 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> 

otrzymuję komunikat o błędzie informujący, „nie można przekonwertować«SelectViewFeedDataCommand»”. Otrzymuję podobny błąd także dla drugiego elementu ComboBoxItem. ICommand jest zdefiniowany w klasie ViewModel, która jest DataSource dla UserControl, związana jako DataTemplate.

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

ja zbadali to dość intensywnie, ale nie znalazłem odpowiedzi na jak skutecznie związać ICommand do ComboBoxItem.

Dostosowuję to z istniejącego kodu, który użył zestawu radiobuttons i związanych z nimi poleceń, co odbywa się dość łatwo. Czy nie ma prostego sposobu na zrobienie tego z ComboBox?

Dzięki.

+1

Co o wiązaniu 'własność ComboBox.SelectedItem' do czegoś, a potem robi logiki poleceń w' imprezy PropertyChanged' swojej własności SelectedComboBoxItem? – Rachel

Odpowiedz

0

szukałem w moich starych postach i zdałem sobie sprawę, że nigdy nie opublikowałem rozwiązania mojego pytania ... całkiem proste (jeśli nie eleganckie). Właśnie stworzyliśmy listę w moim ViewModel, który zawierał moje „wyborów” Combo Box i wtedy, gdy SelectedValue zostało zmienione, wywołane moją „przemienieni” logikę w seter na miejscu:

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

A z punktu widzenia model :

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

      //additional code to perform here 

     } 
    } 
0

Czy próbowałeś wprowadzić polecenie do wiązania?

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

Edycja dla zaktualizowanej strategii:

Ponieważ pozycja ComboBox nie obsługuje bezpośrednie polecenie wiązania, spróbuj utworzyć załączony właściwość:

Link

+0

Tak, mam. Pojawia się komunikat o błędzie: "Powiązanie A" nie może być ustawione we właściwości "Command" typu "CommandBinding", a "Powiązanie" może być ustawione tylko na DependencyProperty obiektu DependencyObject. " – jpaull