如何使用 InvokeCommandAction 调用我的方法并传入参数?
How do I go about using InvokeCommandAction to call a method of mine and pass in parameters?
我一直在想办法从 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 的新手,所以如果我问的问题看起来很愚蠢,请耐心等待。我浏览了 Whosebug 阅读其他类似的问题,但无法收集到足够的信息来继续我自己的工作。
命令绑定需要一个实现 ICommand 接口的具体实例。您正在绑定到一个方法名称,它根本不会真正绑定。命令绑定旨在用于 MVVM 设计中的 ViewModel class,但从您的示例代码来看,您似乎是在 Xaml 视图的代码隐藏中使用它。如果您想坚持代码隐藏,只需使用事件处理程序。
有很多关于 ICommand 实现的示例,您也可以开箱即用 DelegateCommand available in 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绑定:
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding ExpanderCommand}"
CommandParameter="x:Static local:Sections.Opening"/>
</i:EventTrigger>
我一直在想办法从 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 的新手,所以如果我问的问题看起来很愚蠢,请耐心等待。我浏览了 Whosebug 阅读其他类似的问题,但无法收集到足够的信息来继续我自己的工作。
命令绑定需要一个实现 ICommand 接口的具体实例。您正在绑定到一个方法名称,它根本不会真正绑定。命令绑定旨在用于 MVVM 设计中的 ViewModel class,但从您的示例代码来看,您似乎是在 Xaml 视图的代码隐藏中使用它。如果您想坚持代码隐藏,只需使用事件处理程序。
有很多关于 ICommand 实现的示例,您也可以开箱即用 DelegateCommand available in 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绑定:
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding ExpanderCommand}"
CommandParameter="x:Static local:Sections.Opening"/>
</i:EventTrigger>