10

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

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

4

3 回答 3

18

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

如果这还不够,那么我会使用附加行为来解决这个问题。在 Julian Dominguez 的博客上,您会找到一篇关于如何在 Silverlight 中执行非常相似的操作的文章,该文章应该很容易适应 WPF。

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

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

<TextBox
  x:Name="MyTextBox"
  TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />
于 2008-09-11T09:51:56.537 回答
8

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

您可能需要考虑对 VM 中的字符串字段使用数据绑定。这样,您就可以从那里调用命令或函数,而不是让 UI 关心。

<TextBox Text="{Binding WorldName}"/>
....
public string WorldName
{
    get
    {
        return WorldData.Name;
    }
    set
    {
        WorldData.Name = value;
        OnPropertyChanged("WorldName");
        // CallYourCustomFunctionHere();
    }
}
于 2008-09-11T10:07:31.570 回答
2

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

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

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

于 2008-09-11T08:58:41.140 回答