我有一个TextBox,它绑定到Entity-object上的Text-property。 我希望能够重新格式化用户在某些情况下输入的文本 - 例如如果用户输入“2/4”(一小部分) - 我想将其改为“1/2”。
通过Text-property的“set-part”,我可以更改Entity-object上的值,但这不会出现在TextBox中 - 它仍然显示为“2/4”?
答案 0 :(得分:15)
原因是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个月后),此行为已changed in .NET 4,您将不再需要IsAsync。
答案 1 :(得分:0)
您是否实现了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));
}
}