Изменить значение в свойстве сеттера при использовании двусторонней привязки данных 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));
}
}