TextBox.TextChanged 和 ICommandSource
-
09-06-2019 - |
题
我正在关注 MV-VM 我的 WPF UI 的模式。我想将 TextBox 的 TextChanged 事件的命令连接到 ViewModel 类中的命令。我能想到完成此任务的唯一方法是继承 TextBox 控件,并实现 ICommandSource。然后我可以指示从 TextChanged 事件触发该命令。对于看起来如此简单的事情来说,这似乎是太多的工作。
有没有更简单的方法(比子类化 TextBox 和实现 ICommandSource)将 TextChanged 事件连接到我的 ViewModel 类?
解决方案
首先,您肯定考虑过使用 PropertyChanged 的 UpdateSourceTrigger 将双向数据绑定到您的视图模型?这样每次文本更改时都会调用您绑定的属性的属性设置器?
如果这还不够,那么我将使用附加行为来解决这个问题。在 Julian Dominguez 的博客上,您会发现 文章 关于如何在 Silverlight 中做一些非常类似的事情,它应该很容易适应 WPF。
基本上,在静态类(称为 TextBoxBehaviours)中,您定义一个名为(可能)ICommand 类型的 TextChangedCommand 的附加属性。为该属性连接一个 OnPropertyChanged 处理程序,并在处理程序中检查该属性是否在 TextBox 上设置;如果是,请将处理程序添加到文本框上的 TextChanged 事件,该处理程序将调用属性中指定的命令。
然后,假设您的视图模型已分配给视图的 DataContext,您将像下面这样使用它:
<TextBox
x:Name="MyTextBox"
TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />
其他提示
使用事件绑定和命令方法可能不是正确的选择。这个命令到底会做什么?
您可能需要考虑对虚拟机中的字符串字段使用数据绑定。这样,您就可以从那里调用命令或函数,而不必关心 UI。
<TextBox Text="{Binding WorldName}"/>
....
public string WorldName
{
get
{
return WorldData.Name;
}
set
{
WorldData.Name = value;
OnPropertyChanged("WorldName");
// CallYourCustomFunctionHere();
}
}
您不能只处理 TextChanged 事件并从那里执行命令吗?
private void _textBox_TextChanged(object sender, EventArgs e)
{
MyCommand.Execute(null);
}
正如你所说,另一种选择是创建一个 TextBox
它充当命令源,但这似乎有点矫枉过正,除非您计划在许多地方共享和利用它。