【问题标题】:How to add command in button control with WPF (Backend) [closed]如何使用 WPF(后端)在按钮控件中添加命令 [关闭]
【发布时间】:2016-02-18 15:11:00
【问题描述】:

如何在 WPF 中使用后端代码向按钮控件添加命令?

【问题讨论】:

  • 能否请您更具体地提出您的问题?您想直接在代码中创建一个按钮,或者您想将 Viewmodel 中的某些命令显示为按钮?
  • 是的,我正在从 var btnCompare = new Button(); 之类的代码动态创建一个按钮,但我想在那里添加一个命令选项。
  • 这种方式只需设置命令属性。您需要在后端代码中实例化一个,并通过Binding语法将此实例值设置为按钮Command属性

标签: wpf command controls


【解决方案1】:

在代码隐藏中添加命令的简单示例

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 方法的返回值。它可以通过将委托作为参数传递并在您的命令中实现 CanExecuteChanged 事件作为 CommandManager.RequerySuggested 事件的包装器来实现。命令应该触发 CanExecuteChanged 以通知框架,CanExecute 方法的返回值已更改。

通常,每次用户与应用程序的界面交互时都会触发 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;

    }
}

【讨论】:

  • 滥用一点如何添加参数?我尝试 btnCompare.Command = new ListFolderModel(); btnCompare.CommandParameter = getBoolValue(); ,但我不知道如何捕捉它以更改 CanExecute 方法的值
  • 您可以将命令参数作为绑定添加到其他一些依赖属性。或者您可以将您的命令参数提供为 Func,例如btnCompare.CommandParameter = () => getBoolValue(); CommandManager.InvalidateRequerySuggested() 方法也可能有所帮助。您能否澄清一下您想要实现的目标?
  • 非常感谢,这正是我想要做的
  • 不客气!但我建议坚持使用在 ViewModel 中定义的经典 MVVM 方法和命令。
猜你喜欢
  • 2012-01-13
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多