2010-06-28 8 views
14

He conectado un SelectedItemChangeEvent de ComboBox a un ICommand en mi modelo de vista. Todo parece funcionar bien, pero no sé cómo obtener SelectedItem de ComboxBox. Creo que necesito usar CommandParameter de EventToCommand, ¿debo vincular esto a algo en mi ViewModel que tenga el elemento seleccionado de ComboBox? He intentado esto:Mvvm-Light Silverlight, usando EventToCommand con 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> 

y en mi modelo de vista:

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

public CategoryType SelectedCategory 
{ 
    get; set; 
} 

y la 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; 
    } 

} 

Sin embargo, el parámetro en el método Execute del ICommand siempre es nula. Todavía no tengo experiencia con SilverLight, así que creo que me falta algo obvio aquí. ¿Alguien puede ayudar? ¡Gracias por adelantado!

Respuesta

20

Después de hacer algo de investigación he encontrado que es muy fácil de pasar los SelectionChangedEventArgs reales como parámetro de ejecución de ICommand:

acaba de establecer 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> 

Y luego, en el método Execute hacer algo como:

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

Debe marcar su respuesta especialmente, ya que resolvió su problema. – kevindaub

+0

gracias hombre del paquete, ahorra mi día – zeeshan

7

Puede intentar agregar un parámetro de comando y pasar una lista a su comando de relé

Algo similar se describe hacia la parte inferior de esta página, pero con una cuadrícula de datos: http://mvvmlight.codeplex.com/ El código de esa página es el siguiente:

<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 hace esto, su RelayCommand tendría que hacer frente a la parámetros que entra Algo como esto en su modelo de vista:.

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; 
    }); 
Cuestiones relacionadas