【问题标题】:How do I go about using InvokeCommandAction to call a method of mine and pass in parameters?如何使用 InvokeCommandAction 调用我的方法并传入参数?
【发布时间】:2015-05-27 22:16:03
【问题描述】:

我一直在试图弄清楚如何从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,阅读了其他类似的问题,但无法获得足够的信息来独自继续。

【问题讨论】:

    标签: c# wpf xaml events parameter-passing


    【解决方案1】:

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

    有很多关于 ICommand 实现的示例,您也可以使用开箱即用的 DelegateCommandPrism。我在下面展示了一个简单的示例,它实现了一个非常基本的 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      相关资源
      最近更新 更多