TextBox.TextChanged和ICommandSource

时间:2020-03-05 18:51:14  来源:igfitidea点击:

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

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

解决方案

回答

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

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

就像我们说的那样,替代方法是创建一个充当命令源的" TextBox",但除非我们计划在许多地方共享和利用它,否则这似乎有些过分。

回答

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

如果这还不够,那么我将使用"添加行为"解决此问题。在Julian Dominguezs博客上,我们将找到有关如何在Silverlight中执行非常相似的操作的文章,该文章应易于适应WPF。

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

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

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

回答

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

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

<TextBox Text="{Binding WorldName}"/>
....
public string WorldName
{
    get
    {
        return WorldData.Name;
    }
    set
    {
        WorldData.Name = value;
        OnPropertyChanged("WorldName");
        // CallYourCustomFunctionHere();
    }
}