2010-06-28 3 views
14

J'ai connecté un SelectedItemChangeEvent d'un ComboBox à un ICommand dans mon modèle de vue. Tout semble bien fonctionner mais je ne sais pas comment obtenir le SelectedItem de la ComboxBox. Je pense que j'ai besoin d'utiliser le CommandParameter de l'EventToCommand - puis-je lier cela à quelque chose dans mon ViewModel qui a l'élément selectedItem de la ComboBox? Je l'ai essayé ceci:Mvvm-Light Silverlight, en utilisant EventToCommand avec un Combobox

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

et dans mon modèle de vue:

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

public CategoryType SelectedCategory 
{ 
    get; set; 
} 

et 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; 
    } 

} 

Cependant, le paramètre dans la méthode d'exécution de l'ICommand est toujours nulle. Je suis assez inexpérimenté avec SilverLight alors je pense que je manque vraiment quelque chose d'évident ici. Quelqu'un peut-il aider? Merci d'avance!

Répondre

20

Après avoir fait quelques recherches, je trouve qu'il est très simple de passer les SelectionChangedEventArgs réels en tant que paramètre exécuter de ICommand:

Il suffit de définir 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> 

Et puis dans la méthode Execute faire quelque chose comme:

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

Vous devriez marquer votre réponse particulièrement parce qu'elle a résolu votre problème. – kevindaub

+0

thanx un homme de bundle, sauvez ma journée – zeeshan

7

Vous pouvez essayer d'ajouter un CommandParameter et passer une liste à votre relaisCommand

Quelque chose de similaire est décrite vers le bas de cette page, mais avec un DataGrid: http://mvvmlight.codeplex.com/ Le code de cette page ressemble à ceci:

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

Si vous faites cela, votre RelayCommand devrait faire face à la paramètres entrant Quelque chose comme ça dans votre 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; 
    }); 
Questions connexes