2010-06-28 2 views
14

Я подключил ComboBox SelectedItemChangeEvent к ICommand в моей модели просмотра. Кажется, что все работает нормально, но я не знаю, как получить SelectedItem из ComboxBox. Я думаю, мне нужно использовать CommandParameter EventToCommand - я привязываю это к чему-то в моей модели ViewModel, у которой есть выбранный элемент ComboBox? Я попытался это:Mvvm-Light Silverlight, используя EventToCommand с 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> 

и на мой взгляд, модель:

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

public CategoryType SelectedCategory 
{ 
    get; set; 
} 

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

} 

Однако параметр в методе Execute в ICommand всегда нуль. Я довольно неопытен с SilverLight, поэтому я думаю, что мне действительно не хватает чего-то очевидного здесь. Может ли кто-нибудь помочь? Заранее спасибо!

ответ

20

После выполнения некоторого копания я обнаружил, что это очень просто, чтобы передать фактические SelectionChangedEventArgs в качестве выполнения параметра ICommand в:

Просто установите 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> 

, а затем в методе Execute сделать что-то вроде:

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

Вы должны отметить свой ответ, особенно потому, что он решил вашу проблему. – kevindaub

+0

thanx the bundle man, сохранить мой день – zeeshan

7

Вы можете попробовать добавить CommandParameter и передать список на свой relayCommand

Нечто подобное описано в нижней части этой страницы, но с DataGrid: http://mvvmlight.codeplex.com/ код с этой страницы выглядит следующим образом:

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

Если вы сделаете это, ваш RelayCommand нужно будет иметь дело с параметры приходят в что-то подобное в вашей 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; 
    }); 
Смежные вопросы