其他分享
首页 > 其他分享> > 如何使用InvokeCommandAction调用我的方法并传递参数?

如何使用InvokeCommandAction调用我的方法并传递参数?

作者:互联网

我一直在尝试找出如何从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
    }

在同一个命名空间下有一个Enum:

public enum Sections
{
    Default = 0,
    Opening = 1,
    Verify = 2
}

我需要做些什么来使用上面发布的XAML调用我的方法?我是WPF的新手,所以如果我最后问什么似乎是愚蠢的问题,请尝试并忍受.我浏览了stackoverflow并阅读了其他类似的问题,并且无法获取足够的信息以继续自己解决问题.

解决方法:

命令绑定需要实现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>

标签:parameter-passing,wpf,xaml,events,c
来源: https://codeday.me/bug/20191028/1951232.html