TextBox.TextChanged& ICommandSource

时间:2008-09-11 05:36:18

标签: wpf mvvm command event-binding

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

是否有更简单的方法(比继承TextBox和实现ICommandSource)将TextChanged事件连接到我的ViewModel类?

3 个答案:

答案 0 :(得分:18)

首先,您肯定考虑使用PropertyChanged的UpdateSourceTrigger将双向数据绑定到您的viewmodel?那样,每次更改文本时都会调用绑定到的属性的属性设置器吗?

如果这还不够,那么我会使用Attached Behaviors解决这个问题。在Julian Dominguez的博客上,你会发现article关于如何在Silverlight中做一些非常相似的事情,它应该很容易适应WPF。

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

然后,假设您的viewmodel已分配给View的DataContext,您可以使用它:

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

答案 1 :(得分:8)

使用事件绑定和命令方法可能不是正确的选择。 这个命令究竟会做什么?

您可能需要考虑使用数据绑定到VM中的字符串字段。通过这种方式,您可以从那里调用命令或函数,而不是完全关注UI。

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

答案 2 :(得分:2)

你能不能只处理TextChanged事件并从那里执行命令?

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

正如你所说的那样,另一种方法是创建一个充当命令源的TextBox,但这似乎有点矫枉过正,除非你计划在很多地方分享和利用它。