如何在ListView的SelectionChanged上调用ViewModel上的命令?

时间:2013-03-07 09:09:20

标签: c# wpf listview mvvm command

在MVVM / WPF环境中,我想在引发ListView的ComputeCommand事件时在ViewModel上调用命令(SelectionChanged)。如何在XAML或C#中完成?

这是我的命令类。我在代码隐藏中尝试了MainViewModel.Instance.MyCommand.Execute();,但它不接受。

public class ComputeCommand : ICommand
{
    public ComputeCommand(Action updateReport)
    {
        _executeMethod = updateReport;
    }

    Action _executeMethod;

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        _executeMethod.Invoke();
    }
}       

4 个答案:

答案 0 :(得分:2)

要回答您的问题 - 您缺少参数。这个电话应该有效:

MainViewModel.Instance.MyCommand.Execute(null);

但是,你不需要ICommand,这个界面有不同的用途。

您需要的是在视图侧处理SelectionChanged

var vm = DataContext as YourViewModelType;
if (vm != null)
{
    vm.Compute(); //some public method, declared in your viewmodel
}

或通过绑定到项容器的IsSelected属性来在viewmodel端处理它

答案 1 :(得分:2)

我真的建议使用像MVVM Light这样的Mvvm框架,所以你可以这样做:

XAML:

xmlns:MvvmLight_Command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"
xmlns:Custom="clr-namespace:System.Windows.Interactivity;  assembly=System.Windows.Interactivity"

 <ListBox>
 ...
     <Custom:Interaction.Triggers>
          <Custom:EventTrigger EventName="SelectionChanged ">
             <MvvmLight_Command:EventToCommand PassEventArgsToCommand="False" Command="{Binding Path=ComputeCommand}"/>
          </Custom:EventTrigger>
     </Custom:Interaction.Triggers>

</Listbox>

视图模型:

public RelayCommand ComputeCommand{ get; private set; }

这是IMO保持活动布线干净整洁的优雅方式。

答案 2 :(得分:1)

一般情况下:要在引发控件事件时调用命令,可以使用EventTriggers。

<ListView>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged" >
            <i:InvokeCommandAction Command="{Binding CommandToBindTo}" CommandParameter="{Binding CommandParameterToBindTo}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ListView>

为此,您需要在XAML中引用 System.Windows.Interactivity.dll

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

话虽这么说,你应该使用MVMM框架,例如MVVM来简化命令的实现。从长远来看,对于您需要的每个命令都只有一个类是不可维护的。像MVVMLight或PRISM这样的框架提供DelegateCommands,允许您直接从委托(ViewModel上的方法)创建新命令。

答案 3 :(得分:0)

首先,您必须为Command定义绑定,因此必须具有该功能 在命令的调用上执行。

可以在XAML中完成,例如:

<CommandBinding Command="name_of_the_namespace:ComputeCommand" Executed="ComputeCommandHandler" />

之后,您可以在某些类中初始化命令,例如:

 public class AppCommands {
    public static readonly ICommand ComputeCommand = 
             new   RoutedCommand("ComputeCommand", typeof(AppCommands));
 }

之后可以使用它:

 AppCommands.ComputeCommand.Execute(sender);

当你处理WPF,所以MVVM模式时,你需要编写通常的更多代码,但要从灵活性中获益。