2010-06-28 3 views
14

Ho collegato un oggetto SelectedItemChangeEvent di ComboBox a un ICommand nel mio modello di vista. Tutto sembra funzionare bene, tuttavia non so come ottenere il SelectedItem del ComboxBox. Penso di aver bisogno di usare il CommandParameter di EventToCommand - posso associarlo a qualcosa nel mio ViewModel che ha l'oggetto selezionato del ComboBox? Ho provato questo:Mvvm-Light Silverlight, utilizzando EventToCommand con una casella combinata

<ComboBox 
    Width="422" 
    Height="24" 
    DisplayMemberPath="Name" 
    ItemsSource="{Binding CategoryTypes}" 
    SelectedItem="{Binding SelectedCategory}" 
    > 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <MvvmLight:EventToCommand 
       Command="{Binding SelectCategoryCommand,Mode=TwoWay}" 
       CommandParameter="{Binding SelectedCategory, Mode=TwoWay}" 
       MustToggleIsEnabledValue="True" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ComboBox> 

e nel mio modello di vista:

public ICommand SelectCategoryCommand 
{ 
    get 
    { 
     return new SelectCategoryCommand(this); 
    } 
} 

public CategoryType SelectedCategory 
{ 
    get; set; 
} 

e ICommand

public class SelectCategoryCommand : ICommand 
{ 
    private RowViewModel _rowViewModel; 

    public SelectCategoryCommand(RowViewModel rowViewModel) 
    { 
     _rowViewModel = rowViewModel; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     CategoryType categoryType = (CategoryType) parameter; 
    } 

} 

Tuttavia il parametro nel metodo Execute del ICommand è sempre nullo. Sono abbastanza inesperto con SilverLight quindi penso che mi manchi davvero qualcosa di ovvio qui. Qualcuno può aiutare? Grazie in anticipo!

risposta

20

Dopo aver fatto qualche scavo ho scoperto che è molto semplice da passare i SelectionChangedEventArgs effettivi come parametro di esecuzione di ICommand:

Basta impostare PassEventArgsToCommand="True"

<ComboBox Width="422" 
      Height="24" 
      DisplayMemberPath="Name" 
      ItemsSource="{Binding CategoryTypes}" 
      SelectedItem="{Binding SelectedCategory}"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <MvvmLight:EventToCommand Command="{Binding SelectCategoryCommand,Mode=TwoWay}" 
             MustToggleIsEnabledValue="True" 
             PassEventArgsToCommand="True"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ComboBox> 

E poi nel metodo Execute fare qualcosa di simile:

public void Execute(object parameter) 
{ 
    SelectionChangedEventArgs e = (SelectionChangedEventArgs)parameter; 
    CategoryType categoryType = (CategoryType)e.AddedItems[0]; 
} 
+0

Dovresti segnare la tua risposta soprattutto dal momento che ha risolto il tuo problema. – kevindaub

+0

grazie a un fagotto, salva la mia giornata – zeeshan

7

Si può provare ad aggiungere un CommandParameter e passare un elenco al relayCommand

Qualcosa di simile è descritto verso la parte inferiore di questa pagina, ma con un datagrid: http://mvvmlight.codeplex.com/ Il codice da quella pagina si presenta così:

<sdk:DataGrid x:Name="MyDataGrid" ItemsSource="{Binding Items}"> 
    <i:Interaction.Triggers> 
    <i:EventTrigger EventName="SelectionChanged"> 
    <cmd:EventToCommand Command="{Binding SelectionChangedCommand}" 
         CommandParameter="{Binding SelectedItems, ElementName=MyDataGrid}" /> 
    </i:EventTrigger> 
    </i:Interaction.Triggers> 
</sdk:DataGrid> 

Se si esegue questa operazione, il tuo relayCommand avrebbe bisogno di affrontare il i parametri in arrivo Qualcosa di simile a questo nel vostro ViewModel:.

public RelayCommand<IList> SelectionChangedCommand{ get; private set;} 

...

SelectionChangedCommand = new RelayCommand<IList>(
    items => 
    { 
     if (items == null) 
     { 
      NumberOfItemsSelected = 0; 
      return; 
     } 
     //Do something here with the records selected that were passed as parameters in the list 
     //example: NumberOfItemsSelected = items.Count; 
    });