如何使用 WPF(后端)在按钮控件中添加命令
How to add command in button control with WPF (Backend)
如何使用后端代码向WPF中的按钮控件添加命令?
在代码隐藏中添加命令的简单示例
class SomeCommand : ICommand
{
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
MessageBox.Show("From command");
}
}
并且在 InitializeComponent() 之后的构造函数中;
var btnCompare = new Button();
btnCompare.Content = "Compare";
btnCompare.Command = new SomeCommand();
grid.Children.Add(btnCompare);
更新
正如我从您的评论中了解到的,您想将参数传递给命令,它应该根据某些条件更改 ICommand.CanExecute 方法的 return 值。这可以通过将委托作为参数传递并在命令中实现 CanExecuteChanged 事件作为 CommandManager.RequerySuggested 事件的包装器来实现。命令应触发 CanExecuteChanged 以通知框架,CanExecute 方法的 return 值已更改。
通常 CommandManager.RequerySuggested 每次用户与应用程序界面交互时都会触发,对于其他情况,您可以调用 CommandManager.InvalidateRequerySuggested() 静态方法。
下面是说明该方法的代码。
XAML
<Grid Name="grid">
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<CheckBox Content="Bool value is true" Click="checkBoxBool_Click" IsChecked="True"/>
</Grid>
C#
class SomeCommand : ICommand
{
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
Func<bool> isTrue = (Func<bool>)parameter;
return isTrue != null && isTrue();
}
public void Execute(object parameter)
{
MessageBox.Show("From command");
}
}
...
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var btnCompare = new Button();
btnCompare.Content = "Compare";
btnCompare.CommandParameter = new Func<bool> (() => GetBoolValue());
btnCompare.Command = new SomeCommand();
btnCompare.SetValue(Grid.RowProperty, 1);
grid.Children.Add(btnCompare);
}
private bool _boolValue = true;
private bool GetBoolValue()
{
return _boolValue;
}
private void checkBoxBool_Click(object sender, RoutedEventArgs e)
{
_boolValue = (e.Source as CheckBox).IsChecked == true;
}
}
如何使用后端代码向WPF中的按钮控件添加命令?
在代码隐藏中添加命令的简单示例
class SomeCommand : ICommand
{
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
MessageBox.Show("From command");
}
}
并且在 InitializeComponent() 之后的构造函数中;
var btnCompare = new Button();
btnCompare.Content = "Compare";
btnCompare.Command = new SomeCommand();
grid.Children.Add(btnCompare);
更新
正如我从您的评论中了解到的,您想将参数传递给命令,它应该根据某些条件更改 ICommand.CanExecute 方法的 return 值。这可以通过将委托作为参数传递并在命令中实现 CanExecuteChanged 事件作为 CommandManager.RequerySuggested 事件的包装器来实现。命令应触发 CanExecuteChanged 以通知框架,CanExecute 方法的 return 值已更改。
通常 CommandManager.RequerySuggested 每次用户与应用程序界面交互时都会触发,对于其他情况,您可以调用 CommandManager.InvalidateRequerySuggested() 静态方法。 下面是说明该方法的代码。
XAML
<Grid Name="grid">
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<CheckBox Content="Bool value is true" Click="checkBoxBool_Click" IsChecked="True"/>
</Grid>
C#
class SomeCommand : ICommand
{
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
Func<bool> isTrue = (Func<bool>)parameter;
return isTrue != null && isTrue();
}
public void Execute(object parameter)
{
MessageBox.Show("From command");
}
}
...
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var btnCompare = new Button();
btnCompare.Content = "Compare";
btnCompare.CommandParameter = new Func<bool> (() => GetBoolValue());
btnCompare.Command = new SomeCommand();
btnCompare.SetValue(Grid.RowProperty, 1);
grid.Children.Add(btnCompare);
}
private bool _boolValue = true;
private bool GetBoolValue()
{
return _boolValue;
}
private void checkBoxBool_Click(object sender, RoutedEventArgs e)
{
_boolValue = (e.Source as CheckBox).IsChecked == true;
}
}