我正在遵循WPF UI的M-V-VM模式。我想将一个命令连接到TextBox的TextChanged事件到我的ViewModel类中的命令。我可以设想完成此任务的唯一方法是继承TextBox控件,并实现ICommandSource。然后,我可以指示从TextChanged事件触发该命令。对于看起来如此简单的事情来说,这似乎太过分了。
是否有更简单的方法(比继承TextBox和实现ICommandSource)将TextChanged事件连接到我的ViewModel类?
答案 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
,但这似乎有点矫枉过正,除非你计划在很多地方分享和利用它。