在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();
}
}
答案 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
模式时,你需要编写通常的更多代码,但要从灵活性中获益。