c# - 如何使用 InvokeCommandAction 调用我的方法并传入参数?

标签 c# wpf xaml events parameter-passing

我一直在想办法从 Loaded="" 事件中传递参数。我在这里问了一个问题:How would I go about passing a parameter on 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 阅读其他类似的问题,但无法收集到足够的信息来继续我自己的工作。

最佳答案

命令绑定(bind)需要一个实现 ICommand 接口(interface)的具体实例。您正在绑定(bind)到一个方法名称,它根本不会真正绑定(bind)。命令绑定(bind)旨在用于 MVVM 设计中的 ViewModel 类,但从您的示例代码看来,您似乎是在 Xaml View 的代码隐藏中使用它。如果您想坚持使用代码隐藏,只需使用事件处理程序即可。

有很多关于 ICommand 实现的例子,你也可以开箱即用 DelegateCommand可用 Prism .我在下面展示了一个简单的示例,它实现了一个非常基本的 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 绑定(bind):

<i:EventTrigger EventName="Loaded">
 <i:InvokeCommandAction Command="{Binding ExpanderCommand}"
                                               CommandParameter="x:Static local:Sections.Opening"/>
</i:EventTrigger>

关于c# - 如何使用 InvokeCommandAction 调用我的方法并传入参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30494035/

相关文章:

wpf - 触发器上的属性不能为空

c# - 使用 IEnumerable 的详细信息实例化列表的基于 LINQ 的优雅方法

c# - 退出后在音乐应用程序中保存播放列表的位置

wpf - 在 WPF 中将 TouchMove 事件映射到 MouseMove 事件

c# - 使用堆栈面板 - 垂直 + 水平

c# - 带有边界框缩放点框的用户控件

c# - 端点的多响应类型

c# - 如何获取导入的MEF函数的汇编信息?

java - Java 和 C# 上的 SHA-1 哈希

.net - Windows 10 ComboBox 的 WPF 样式