TextBox.TextChanged & ICommandSource

Posted

技术标签:

【中文标题】TextBox.TextChanged & ICommandSource【英文标题】: 【发布时间】:2010-09-08 12:34:28 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

如果这还不够,那么我会使用附加行为来解决这个问题。在 Julian Dominguez 的博客上,您会找到一个 article,它讲述了如何在 Silverlight 中做一些非常相似的事情,这应该很容易适应 WPF。

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

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

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

【讨论】:

谢谢 Sam - 有时我看不到简单的选项;在这种情况下,文本框绑定到我的 ViewModel 中的字符串属性。 我不认为向属性的设置器添加逻辑会起作用。 WPF XAML 处理器直接使用依赖属性,而不是通过属性包装器。这意味着当 UI 更新时永远不会调用 setter。 (来源:msdn.microsoft.com/en-us/library/bb613563.aspx) Greg,我指的是依赖属性绑定到的ViewModel中属性的Setter,而不是依赖属性本身的setter。【参考方案2】:

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

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

<TextBox Text="Binding WorldName"/>
....
public string WorldName

    get
    
        return WorldData.Name;
    
    set
    
        WorldData.Name = value;
        OnPropertyChanged("WorldName");
        // CallYourCustomFunctionHere();
    

【讨论】:

谢谢尼多诺库。您的回答也很完美,但我将 Sam 的回答标记为答案,因为他的回答略早于您的回答。不过再次感谢!【参考方案3】:

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

private void _textBox_TextChanged(object sender, EventArgs e)

    MyCommand.Execute(null);

正如您所说,另一种方法是创建一个TextBox 作为命令源,但这似乎有点过头了,除非您计划在许多地方共享和利用它。

【讨论】:

以上是关于TextBox.TextChanged & ICommandSource的主要内容,如果未能解决你的问题,请参考以下文章

TextBox.TextChanged 事件在 Windows Phone 7 模拟器上触发两次

当Timer触发其tick时,如何使TextBox.TextChanged事件不触发?

wpf 自定义控件 的问题 点了按钮以后 反应非常慢 请大神帮助

成人网站PornHub跨站脚本(XSS)漏洞挖掘记

人民日报报道:伟大复兴!数字货币震撼来袭!

python 模块 SQLalchemy