在自定义TextBox中检测PropertyChanged

时间:2014-02-17 15:24:48

标签: c# wpf propertychanged

我已实施自定义TextBox

public class MyTextBox : TextBox
{
    // ...
}

我正在使用XAML:

<MyTextBox Text="{Binding MyProperty}" />

并且它绑定到我的ViewModel中的属性。

public class MyDataContext : INotifyPropertyChanged
{
    public string MyProperty
    {
        get { return _myPropertyBackingField; }
        set
        {
            _myPropertyBackingField = value;
            PropertyChanged(this, new PropertyChangedEventArgs("MyProperty"));
        }
    }

    // ...
}

问题:我如何在MyTextBox中检测到MyProperty已更改?

MyProperty = "NewValue";

优选地,我想区分程序性变化与用户编辑值触发变更的时间。也就是说,我不认为覆盖OnPropertyChanged对我有用。

2 个答案:

答案 0 :(得分:1)

您可以注册PropertyChanged TextBox DataContext的{​​{1}}事件。

var dataContext = DataContext as MyDataContext;
dataContext.PropertyChanged += dataContext_PropertyChanged;

// check for the propertyname and react
void dataContext_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "MyProperty")
    {
        // Do things
    }
}

因此,如果您的viewmodel引发PropertyChanged,您的文本框也会收到通知。但我认为这是不好的做法。你想要达到什么目标?

答案 1 :(得分:0)

OP在这里。

过了一段时间后,我意识到这是绑定,它跟踪从源(DataContext)更新TextBox。因此,可能采取的方法是致电GetBindingExpression(TextProperty)并从中解决问题。

但是,我通过覆盖TextBoxBase.OnTextChanged

解决了这个问题
protected override void OnTextChanged(TextChangedEventArgs e)
{
    base.OnTextChanged(e);
    if (!IsFocused)
    {
        // Do stuff here
    }
}

由于控件没有聚焦,因此必须以编程方式完成更改。这并不完美,因为当TextBox有焦点时,可能会出现一个编程上的变化,但这对我来说已经足够了。