2

我已经实现了一个自定义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对我不起作用。

4

2 回答 2

1

您可以注册到的PropertyChanged事件。TextBoxDataContext

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
    }
}

因此,如果您的视图模型提出PropertyChanged您的文本框也会收到通知。但我认为这是不好的做法。你想达到什么目标?

于 2014-02-17T15:31:55.753 回答
0

在这里。

过了一会儿,我意识到它是跟踪更新TextBox源(DataContext)的绑定。因此,一条可能的途径是打电话GetBindingExpression(TextProperty)并从中解决问题。

但是,我通过覆盖解决了它TextBoxBase.OnTextChanged

protected override void OnTextChanged(TextChangedEventArgs e)
{
    base.OnTextChanged(e);
    if (!IsFocused)
    {
        // Do stuff here
    }
}

由于控制不集中,因此必须以编程方式完成更改。这并不完美,因为当TextBox有焦点时可能会发生程序性更改,但这对我来说已经足够了。

于 2014-02-18T08:43:03.823 回答