Mvvm-Light Silverlight, используя EventToCommand с Combobox - PullRequest
14 голосов
/ 28 июня 2010

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

Ответы [ 2 ]

20 голосов
/ 28 июня 2010

После некоторых копаний я обнаружил, что очень просто передать фактический 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];
}
7 голосов
/ 04 января 2011

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

Нечто подобное описано в нижней части этой страницы, но с сеткой данных: 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;
    });
...