Изменить значение в свойстве сеттера при использовании двусторонней привязки данных WPF

У меня есть TextBox, который связан с Text-свойством объекта Entity. Я хотел бы иметь возможность переформатировать текст, который вводит пользователь при некоторых обстоятельствах - например, если пользователь вводит "2/4" (дробь) - я хотел бы изменить его на "1/2".

С помощью "set-part" свойства Text я могу изменить значение объекта Entity, но оно не отображается в TextBox - оно все еще читает "2/4"?

2 ответа

Решение

Причина этого заключается в том, что система привязки в WPF является "интеллектуальной", и при изменении значения в TextBox предполагается, что событие PropertyChanged сработает для этого свойства, и оно будет проигнорировано.

Вы можете заставить TextBox обновить свои привязки, вызвав:

textBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget();

но трудность заключается в том, чтобы найти хорошее место для этого. Очевидно, ваш объект данных не может этого сделать, поскольку он не имеет ссылки на экземпляр TextBox. Вы можете сделать это в окне, которое содержит TextBox, связав его с обработчиком события PropertyChanged объекта данных, но это не кажется очень чистым.

Я отредактирую этот ответ, если подумаю о лучшем решении, но, по крайней мере, это объясняет причину, по которой привязка не работает.


Ага! Изменение привязки к IsAsync = true:

<TextBox x:Name="textBox" Text="{Binding Path=TestData, IsAsync=true}"/>

По-видимому, изменяет поведение так, чтобы оно обращало внимание на событие PropertyChanged, когда оно вызывается установщиком.


Как дополнение (32 месяца спустя) это поведение было изменено в.NET 4, и вам больше не понадобится IsAsync.

Вы реализовали INotifyPropertyChanged и вызвали его?

    private string _fraction;

    public string Fraction
    {
        get { return _fraction; }
        set
        {
            _fraction = ReduceFraction(value);
            NotifyPropertyChanged("Fraction");
        }
    }

    private string ReduceFraction(string value)
    {
        string result = "1/2";
        // Insert reduce fraction logic here
        return result;
    }


    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
Другие вопросы по тегам