TextBox TextChanged事件问题

时间:2013-06-24 16:22:42

标签: c# wpf mvvm textbox

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

  1. 首次创建TextBox时会调用它,我不想这样做。

  2. 每次添加一个新字符时都会调用它,我只希望在更改基础绑定数据时调用它(这似乎是焦点从框中移开时)。

  3. 我该如何做到这一点?

    编辑:我已经尝试过其他几个TextBox属性,比如Get / LostFocus,但它们似乎永远不会被激发。

    另外,我不想把这个方法调用放在属性的Setter中,因为底层数据在逻辑上与这个项目的UI是分开的,我不希望任何与之相关的方法调用为UI做计算。

5 个答案:

答案 0 :(得分:1)

当焦点从当前元素移开时,事件LostFocus将触发。我试了一下它的工作正常。

答案 1 :(得分:1)

正如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并失去焦点时,将调用Setter of Text1,ViewModel将引发PropertyChanged事件。 2.更改基础Text1时。 Text1也会引发事件,以便View可以知道它。

此外,它可以避免您的两个问题: 1.在第一次绑定时,只调用Text1的getter。没有提出任何事件。 2.只有在TextBox失去焦点后才会调用Text1的Setter。

答案 2 :(得分:0)

  

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

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

  

编辑基础绑定数据时

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

答案 3 :(得分:0)

最佳设计是监听底层绑定属性的变化。如果使用DependencyProperty或者对象实现了INotifyPropertyChanged,则可以在不更改setter的情况下执行此操作。

当底层属性发生更改时(默认情况下为LostFocus,或每次都有一个char)是绑定选项。

如果您不想按照我的意见听取(view-)模型中的更改,您可以订阅GotFocus和LostFocus事件。在获得焦点时保存当前值,在丢失时与当前值进行比较。如果它不同 - &gt;做你想做的事。

答案 4 :(得分:-1)

我不确定你最终想要实现什么,但我会猜测一下。如果您正在遵循MVVM模式,那么看起来您可以通过使用绑定的updateSourceTrigger属性来实现您想要的。如果您没有使用MVVM,那么您可能需要考虑使用MVVM