Изменить значение в свойстве сеттера при использовании двусторонней привязки данных WPF - PullRequest
5 голосов
/ 13 мая 2009

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

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

Ответы [ 2 ]

15 голосов
/ 13 мая 2009

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

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

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

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

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


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

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

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


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

0 голосов
/ 13 мая 2009

Вы реализовали 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));
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...