【问题标题】:TextBox TextChanged Event ProblemsTextBox TextChanged 事件问题
【发布时间】:2013-06-24 16:22:41
【问题描述】:

我正在使用绑定到对象的基本文本框。基本上,我想要做的是每次编辑框中的文本并且用户取消选择框或编辑底层绑定数据时调用一个方法。我现在使用的是 TextChanged 事件,但这有一些问题:

  1. 第一次创建 TextBox 时调用它,我不想要这个。

  2. 每次添加新字符时都会调用它,我只希望在底层绑定数据发生更改时调用它(这似乎是每当焦点从框转移时)。

我怎样才能做到这一点?

编辑:我尝试了其他几个 TextBox 属性,例如 Get/LostFocus,但它们似乎从未触发过。

另外,我不想将此方法调用放在属性的 Setter 中,因为底层数据在逻辑上与该项目的 UI 是分开的,我不希望任何方法调用与为 UI 进行计算。

【问题讨论】:

  • 将逻辑放入属性的setter中。
  • 我添加了一些 cmets 来解决这些问题。
  • Also, I don't want to put this method call in the Setter of the Property - 这就是 ViewModel 的用途。
  • 请举例说明在逻辑上与底层数据分离并为 UI 进行计算的方法调用示例?
  • 正如@Bill Zhang 建议的那样,UpdateSourceTrigger=LostFocus is the trick that worked for me

标签: c# wpf mvvm textbox


【解决方案1】:

当焦点从当前元素转移时触发事件LostFocus。我试过了,效果很好。

【讨论】:

  • 我不知道为什么它不能更早地工作。可能是我在不正确的模板上测试它,但无论如何,它现在可以工作了......
【解决方案2】:

正如 jods 所说,将 TextBox 的 Text 绑定到 ViewModel 属性的最佳方式。代码是:

查看:

<TextBox x:Name="TextBox1" Text="{Binding Path=Text1,Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/>

视图模型:

    public string Text1
    {
        get { return _text1; }
        set
        {
            _text1 = value;
            RaisePropertyChanged("Text1");
        }
    }

查看后面的代码:

    private void ViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "Text1")
        {
            //Call UI related method...
        }
    }

这样,它满足你的两个条件: 1、每次编辑TextBox失去焦点时,Text1的Setter会被调用,ViewModel会引发PropertyChanged事件。 2. 当底层Text1改变时。 Text1 也会引发事件,以便 View 知道它。

它还可以避免您的两个顾虑: 1、第一次绑定,只调用Text1的getter。不引发任何事件。 2. Text1的Setter只有在TextBox失去焦点后才会调用。

【讨论】:

    【解决方案3】:

    每次编辑框中的文本并且用户取消选择框时

    嗯,AFAIK 如果您像这样绑定文本,这是 TextBox 的标准行为:Text={Binding Property}

    当底层绑定数据被编辑时

    您可以在属性的 setter 中提供此功能。

    【讨论】:

      【解决方案4】:

      最好的设计是监听底层绑定属性的变化。如果您使用 DependencyProperty 或您的对象实现 INotifyPropertyChanged,则无需更改设置器即可执行此操作。

      当基础属性发生变化时(默认为 LostFocus,或每次每个字符)是一个绑定选项。

      如果您不想听我的建议来监听(视图)模型的变化,您可以订阅 GotFocus 和 LostFocus 事件。获得焦点时保存当前值,失去焦点时与当前值进行比较。如果不同 -> 做你想做的事。

      【讨论】:

        【解决方案5】:

        我不确定您最终要达到什么目标,但我会对此进行猜测。如果您遵循 MVVM 模式,那么您似乎可以通过使用绑定的 updateSourceTrigger 属性来实现您想要的。如果您没有使用 MVVM,那么您可能会使用 MVVM 看看什么

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-02
          • 1970-01-01
          • 1970-01-01
          • 2015-03-07
          相关资源
          最近更新 更多