Mvvm-Light Silverlight,使用带有Combobox的EventToCommand

bpl*_*lus 14 silverlight selecteditem mvvm-light

我已经在我的视图模型中将ComboBox的SelectedItemChangeEvent连接到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>
Run Code Online (Sandbox Code Playgroud)

在我的视图模型中:

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

public CategoryType SelectedCategory
{
    get; set;
}
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

但是,ICommand的Execute方法中的Parameter始终为null.我对SilverLight很缺乏经验,所以我觉得我真的错过了一些明显的东西.有人可以帮忙吗?提前致谢!

bpl*_*lus 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>
Run Code Online (Sandbox Code Playgroud)

然后在Execute方法中执行以下操作:

public void Execute(object parameter)
{
    SelectionChangedEventArgs e = (SelectionChangedEventArgs)parameter;
    CategoryType categoryType = (CategoryType)e.AddedItems[0];
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*que 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>
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你的relayCommand将需要处理进来的参数.在你的ViewModel中有类似的东西:

public RelayCommand<IList> SelectionChangedCommand{    get;    private set;}
Run Code Online (Sandbox Code Playgroud)

...

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;
    });
Run Code Online (Sandbox Code Playgroud)