TextBox.TextChanged和ICommandSource

Bra*_*ach 10 wpf command mvvm event-binding

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

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

Sam*_*ack 18

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

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

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

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

<TextBox
  x:Name="MyTextBox"
  TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />
Run Code Online (Sandbox Code Playgroud)

  • Greg,我指的是依赖属性绑定到的ViewModel中的属性的Setter,而不是依赖属性本身的setter. (2认同)

Nid*_*ocu 8

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

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

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