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

OPはこちら。

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 に答える