Mvvm-Light Silverlight,使用EventToCommand与Combobox

14

我已经将ComboBox的SelectedItemChangeEvent与ViewModel中的ICommand连接起来了。一切似乎都正常工作,但我不知道如何获取ComboxBox的SelectedItem。我认为我需要使用EventToCommand的CommandParameter - 我是否将其绑定到在ViewModel中具有ComboBox的SelectedItem的某个内容上?我尝试过这样做:

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

}

然而,ICommand的Execute方法中的参数始终为null。我在SilverLight方面还很不熟练,因此我认为我确实错过了一些明显的东西。有谁能帮忙吗?先感谢您!

2个回答

20

经过一番搜索,我发现将实际的 SelectionChangedEventArgs 作为 ICommand 的 execute 参数传递非常简单:

只需设置 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];
}

你应该标记你的答案,特别是因为它解决了你的问题。 - kevindaub

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接