如何使用InvokeCommandAction调用我的方法并传入参数?(How do I go about using InvokeCommandAction to call a method of mine and pass in parameters?)
我一直试图弄清楚如何从
Loaded=""
事件传递参数。 我在这里问了一个问题: 如何在Loaded =“”上传递参数? 并被引导到InvokeCommandAction的方向。问题是我无法弄清楚如何实际使用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>
我在后面的代码中有一个名为
ExpanderLoaded
的方法,如下所示:private void ExpanderLoaded(object sender, RoutedEventArgs e, Sections section) { //Do Stuff }
和同一名称空间下的枚举:
public enum Sections { Default = 0, Opening = 1, Verify = 2 }
使用上面发布的XAML调用我的方法需要做什么? 我是WPF的新手,所以如果我最后问起什么似乎是愚蠢的问题,请试着忍受我。 我浏览了stackoverflow阅读其他类似的问题,并且无法获得足够的信息继续我自己。
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.Issue is I am unable to figure out how to actually use the InvokeCommandAction to call my method. My 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
ExpanderLoaded
in the code behind that goes as follows:private void ExpanderLoaded(object sender, RoutedEventArgs e, Sections section) { //Do Stuff }
And an Enum under the same namespace:
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.
原文:https://stackoverflow.com/questions/30494035
最满意答案
命令绑定需要一个实现ICommand接口的具体实例。 您绑定到方法名称,它根本不会真正绑定。 命令绑定意味着在MVVM设计中的ViewModel类中使用,但是从您的示例代码中可以看出,您在Xaml视图的代码隐藏中使用它。 如果你想坚持代码隐藏,只需使用事件处理程序。
有关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绑定:
<i:EventTrigger EventName="Loaded"> <i:InvokeCommandAction Command="{Binding ExpanderCommand}" CommandParameter="x:Static local:Sections.Opening"/> </i:EventTrigger>
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.
There are lot of examples on ICommand implementation, you can also use out of the box DelegateCommand available 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.
//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:
<i:EventTrigger EventName="Loaded"> <i:InvokeCommandAction Command="{Binding ExpanderCommand}" CommandParameter="x:Static local:Sections.Opening"/> </i:EventTrigger>