在 wpf 中使用 ICommand
using ICommand in wpf
我想用 ICommand
:
替换事件
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
textBox2.Text = textBox1.Text;
}
是否可以用命令替换此事件,我该怎么做?
ButtonBase
类型具有内置的 ICommand Command
和 object CommandParameter
依赖属性。您完全可以通过几种简单的方式创建自己的依赖属性,但这是我的 2 个最重要的建议。
您可以创建自己的 CommandableTextBox
控件,这基本上会向控件添加 2 个依赖属性:ICommand Command
和 object 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));
}
}
我想用 ICommand
:
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
textBox2.Text = textBox1.Text;
}
是否可以用命令替换此事件,我该怎么做?
ButtonBase
类型具有内置的 ICommand Command
和 object CommandParameter
依赖属性。您完全可以通过几种简单的方式创建自己的依赖属性,但这是我的 2 个最重要的建议。
您可以创建自己的 CommandableTextBox
控件,这基本上会向控件添加 2 个依赖属性:ICommand Command
和 object 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));
}
}