在wpf中使用ICommand

时间:2019-02-08 14:26:48

标签: c# wpf icommand

我想用ICommand替换事件:

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
    textBox2.Text = textBox1.Text;
}

是否可以用命令替换此事件,怎么办?

1 个答案:

答案 0 :(得分:0)

ButtonBase类型具有内置的ICommand Commandobject CommandParameter依赖项属性。您绝对可以通过几种简单的方式创建自己的依赖项,但这是我的两个主要建议。

您可以使自己拥有CommandableTextBox控件,该控件基本上向控件添加了2个依赖项属性:ICommand Commandobject CommandParameter

或者您可以创建一个可附加属性(这是我强烈建议的属性),该属性允许您向特定类型添加命令和命令参数。这样做的前期工作更多,但更干净,更易于使用,您可以将其添加到现有的TextBox控件中。

我已经为您编写了可附加的TextChangedCommand。这就是XAML中的样子。在我的解决方案中,我已经将命名空间原样添加到XAML中,但是您需要确保路径正确。

xmlns:attachable="clr-namespace:Question_Answer_WPF_App.Attachable"

<TextBox attachable:Commands.TextChangedCommand="{Binding MyCommand}"
         attachable:Commands.TextChangedCommandParameter="{Binding MyCommandParameter}"/>

这是为您提供的附加属性:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace Question_Answer_WPF_App.Attachable
{
    public class Commands
    {
        public static ICommand GetTextChangedCommand(TextBox textBox) 
            => (ICommand)textBox.GetValue(TextChangedCommandProperty);
        public static void SetTextChangedCommand(TextBox textBox, ICommand command) 
            => textBox.SetValue(TextChangedCommandProperty, command);
        public static readonly DependencyProperty TextChangedCommandProperty =
            DependencyProperty.RegisterAttached(
                "TextChangedCommand", 
                typeof(ICommand), 
                typeof(Commands),
                new PropertyMetadata(null, new PropertyChangedCallback((s, e) =>
                {
                    if (s is TextBox textBox && e.NewValue is ICommand command)
                    {
                        textBox.TextChanged -= textBoxTextChanged;
                        textBox.TextChanged += textBoxTextChanged;    
                        void textBoxTextChanged(object sender, TextChangedEventArgs textChangedEventArgs)
                        {
                            var commandParameter = GetTextChangedCommandParameter(textBox);
                            if (command.CanExecute(commandParameter))
                                command.Execute(commandParameter);
                        }
                    }
                })));

        public static object GetTextChangedCommandParameter(TextBox textBox) 
            => textBox.GetValue(TextChangedCommandParameterProperty);
        public static void SetTextChangedCommandParameter(TextBox textBox, object commandParameter) 
            => textBox.SetValue(TextChangedCommandParameterProperty, commandParameter);
        public static readonly DependencyProperty TextChangedCommandParameterProperty =
            DependencyProperty.RegisterAttached("TextChangedCommandParameter", typeof(object), typeof(Commands), new PropertyMetadata(null));
    }
}