2008-09-11 26 views
9

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

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

回答

18

首先,您肯定会考虑使用PropertyChanged的UpdateSourceTrigger对视图模型进行双向数据绑定?那样,每次文本被改变时,你绑定的属性的属性设置器都会被调用?

如果这还不够,那么我会使用附加行为来解决这个问题。在Julian Dominguez的Blog上,你会发现一个article关于如何在Silverlight中做类似的事情,这应该很容易适应WPF。

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

然后,假设您的视图模型已经被分配到View的DataContext的,你会用它想:

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

谢谢萨姆 - 有时我看不到简单的选项;在这种情况下,它的文本框绑定到我的ViewModel中的字符串属性。 – 2008-09-11 22:33:13

+0

我不认为增加逻辑的属性的设置将工作。 WPF XAML处理器直接使用依赖项属性,而不是通过属性包装器。这意味着在更新UI时永远不会调用setter。 (来源:http://msdn.microsoft.com/en-us/library/bb613563.aspx) – Greg 2009-08-15 01:51:11

3

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

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

的选择,就像你说的,是创建一个TextBox充当命令源,但是这似乎有点小题大做,除非它的东西,你打算共享的,在许多地方利用。

8

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

您可能想考虑在数据绑定中使用数据绑定到您的虚拟机中的字符串字段。通过这种方式,您可以从此处调用某个命令或函数,而不必关心UI。

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