wpf 如何使用 InvokeCommandAction 调用我的方法并传入参数?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/30494035/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I go about using InvokeCommandAction to call a method of mine and pass in parameters?
提问by Douglas Gaskell
I've been trying to figure out how to pass parameters from the Loaded=""event. I asked a question here: How would I go about passing a parameter on Loaded=" "?and was guided in the direction of InvokeCommandAction.
我一直在试图弄清楚如何从Loaded=""事件中传递参数。我在这里问了一个问题:我将如何在 Loaded="" 上传递参数?并被引导到 InvokeCommandAction 的方向。
Issue is I am unable to figure out how to actually use the InvokeCommandAction to call my method. My XAML:
问题是我无法弄清楚如何实际使用 InvokeCommandAction 来调用我的方法。我的 XAML:
<Expander x:Name="Greeting_And_Opening_Expander" ExpandDirection="Down" IsExpanded="True" FontSize="14" FontWeight="Bold" Margin="5" BorderThickness="1" BorderBrush="#FF3E3D3D">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding ExpanderLoaded}"
CommandParameter="x:Static local:Sections.Opening"/>
</i:EventTrigger>
</i:Interaction.Triggers>
I have a method named ExpanderLoadedin the code behind that goes as follows:
我ExpanderLoaded在后面的代码中命名了一个方法,如下所示:
private void ExpanderLoaded(object sender, RoutedEventArgs e, Sections section)
{
//Do Stuff
}
And an Enum under the same namespace:
以及同一命名空间下的 Enum:
public enum Sections
{
Default = 0,
Opening = 1,
Verify = 2
}
What do I need to do to call my method using the XAML I posted above? I am very new to WPF, so please try and bear with me if I end up asking what seem to be stupid questions. I've browsed around stackoverflow reading other similar questions and have been unable to gleam enough information to continue on my own.
我需要做什么才能使用我上面发布的 XAML 调用我的方法?我对 WPF 很陌生,所以如果我最终问了一些似乎很愚蠢的问题,请试着忍受我。我浏览过 stackoverflow 并阅读了其他类似的问题,但一直无法提供足够的信息来继续我自己的工作。
回答by loopedcode
Command Binding requires a concrete instance that implements ICommand interface. You are binding to a method name, which will not really bind at all. Command binding is meant to be used in ViewModel class within MVVM design, but from your sample code it seems you are using it within code-behind of the Xaml view. If you want to stick to code-behind, just use event handler.
命令绑定需要一个实现 ICommand 接口的具体实例。您正在绑定到一个方法名称,该名称根本不会真正绑定。命令绑定旨在用于 MVVM 设计中的 ViewModel 类,但从您的示例代码来看,您似乎是在 Xaml 视图的代码隐藏中使用它。如果您想坚持使用代码隐藏,只需使用事件处理程序。
There are lot of examples on ICommand implementation, you can also use out of the box DelegateCommandavailable in Prism. I am showing a simple example below which implements a very basic ICommand that will work for what you are trying to do as long as your View and ViewModel is wired up.
有很多关于 ICommand 实现的示例,您也可以使用Prism中提供的开箱即用的DelegateCommand。我在下面展示了一个简单的例子,它实现了一个非常基本的 ICommand,只要你的 View 和 ViewModel 连接起来,它就会为你正在尝试做的事情工作。
//Very basic ICommand implementation
public class RelayCommand : ICommand
{
private Action<object> command;
private Func<bool> canExecute;
public RelayCommand(Action<object> commandAction, Func<bool> canExecute = null)
{
this.command = commandAction;
this.canExecute = canExecute;
}
/// <summary>
/// Returns default true.
/// Customize to implement can execute logic.
/// </summary>
public bool CanExecute(object parameter)
{
return this.canExecute == null ? true : this.canExecute();
}
/// <summary>
/// Implement changed logic if needed
/// </summary>
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
if (this.command != null)
{
this.command(parameter);
}
}
}
//Example of a view model
public class MyViewModel
{
public MyViewModel()
{
this.ExpanderCommand = new RelayCommand(this.ExecuteExpanderCommand);
}
// This property will be the command binding target
public RelayCommand ExpanderCommand { get; set; }
// this is the handler method
public void ExecuteExpanderCommand(object parameter)
{
var section = (Sections)parameter;
//do your stuff here
}
}
Xaml binding:
Xaml 绑定:
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding ExpanderCommand}"
CommandParameter="x:Static local:Sections.Opening"/>
</i:EventTrigger>

