关于wpf:TextBox.TextChanged

关于wpf:TextBox.TextChanged

TextBox.TextChanged & ICommandSource

我正在为WPF UI遵循M-V-VM模式。我想将一个TextBox的TextChanged事件的命令连接到ViewModel类中的命令。我可以构想完成此任务的唯一方法是从TextBox控件继承,并实现ICommandSource。然后,我可以指示要从TextChanged事件中触发该命令。对于看起来如此简单的东西来说,这似乎太多了。

有没有比将TextBox子类化并实现ICommandSource更为简便的方法来将TextChanged事件连接到我的ViewModel类?


首先,您肯定已考虑使用PropertyChanged的UpdateSourceTrigger将双向数据绑定到您的视图模型。这样,每次更改文本时都会调用绑定到的属性的属性设置器?

如果这还不够,那么我将使用"附加行为"解决此问题。在朱利安·多明格斯(Julian Dominguez)的博客中,您将找到一篇有关如何在Silverlight中执行非常相似的操作的文章,该文章应易于适应WPF。

基本上,在静态类(称为TextBoxBehaviours)中,定义一个名为(也许)ICommand类型的TextChangedCommand的附加属性。为该属性连接一个OnPropertyChanged处理程序,并在该处理程序中,检查是否在TextBox上设置了该属性;如果是,则在文本框上的TextChanged事件中添加一个处理程序,该处理程序将调用属性中指定的命令。

然后,假设您的视图模型已分配给View的DataContext,则可以使用它:

1
2
3
<TextBox
  x:Name="MyTextBox"
  TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />

使用事件绑定和命令方法可能不是正确的选择。
该命令的作用是什么?

您可能要考虑对VM中的字符串字段使用数据绑定。这样,您可以从那里对命令或函数进行调用,而无需完全关心UI。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<TextBox Text="{Binding WorldName}"/>
....
public string WorldName
{
    get
    {
        return WorldData.Name;
    }
    set
    {
        WorldData.Name = value;
        OnPropertyChanged("WorldName");
        // CallYourCustomFunctionHere();
    }
}


您不仅可以处理TextChanged事件并从那里执行命令吗?

1
2
3
4
private void _textBox_TextChanged(object sender, EventArgs e)
{
    MyCommand.Execute(null);
}

就像您说的那样,

替代方法是创建一个TextBox作为命令源,但是除非您计划在许多地方共享和利用它,否则这似乎有点过分了。


推荐阅读