1

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

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

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

我怎样才能做到这一点?

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

此外,我不想将此方法调用放在属性的 Setter 中,因为基础数据在逻辑上与该项目的 UI 是分开的,我不希望任何与计算相关的方法调用用户界面。

4

5 回答 5

1

LostFocus当焦点从当前元素转移时触发该事件。我试过了,它工作正常。

于 2013-06-24T18:18:49.217 回答
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失去焦点的时候,Text1的Setter会被调用,ViewModel会引发PropertyChanged事件。2. 当底层Text1改变时。Text1 也会引发事件,以便 View 知道它。

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

于 2013-06-24T21:04:13.310 回答
0

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

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

编辑底层绑定数据时

您可以在属性的设置器中提供此功能。

于 2013-06-24T16:35:15.467 回答
0

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

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

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

于 2013-06-24T18:25:29.067 回答
-1

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

于 2013-06-24T23:08:59.893 回答