.net 使用WPF双向数据绑定时更改setter属性中的值
我有一个文本框,它绑定到实体对象的文本属性。 我希望能够在某些情况下重新格式化用户输入的文本-例如,如果用户输入“2/4”(分数)-我希望将其更改为“1/2”.net 使用WPF双向数据绑定时更改setter属性中的值,.net,wpf,data-binding,.net,Wpf,Data Binding,我有一个文本框,它绑定到实体对象的文本属性。 我希望能够在某些情况下重新格式化用户输入的文本-例如,如果用户输入“2/4”(分数)-我希望将其更改为“1/2” 通过文本属性的“设置部分”,我可以更改实体对象上的值,但该值不会出现在文本框中–它仍然显示为“2/4”您是否实现了INotifyPropertyChanged并调用了它 private string _fraction; public string Fraction { get { return
通过文本属性的“设置部分”,我可以更改实体对象上的值,但该值不会出现在文本框中–它仍然显示为“2/4”您是否实现了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));
}
}
这是因为WPF中的绑定系统是“智能”的,当您更改文本框中的值时,它会假定PropertyChanged事件将为该属性触发并忽略它 您可以通过调用以下命令强制文本框刷新其绑定:
textBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
但困难在于找到一个好的地方将其纳入其中。显然,您的数据对象无法执行此操作,因为它没有对TextBox实例的引用。您可以通过将文本框链接到数据对象的PropertyChanged事件处理程序,在保存文本框的窗口中执行此操作,但这感觉不是很干净
如果我想到更好的解决方案,我会编辑这个响应,但至少这解释了绑定不起作用的原因
啊哈!将绑定更改为IsAsync=true:
<TextBox x:Name="textBox" Text="{Binding Path=TestData, IsAsync=true}"/>
似乎会改变行为,以便在setter触发PropertyChanged事件时,它会注意到该事件
作为补充(32个月后),这种行为已经过时,您将不再需要IsAsync。添加
IsAsync=true
对我来说很有效,但由于我的属性现在被非GUI线程使用,因此导致了一些跨线程异常。如果添加<代码> ISASYNC=Trime,请确保考虑线程复杂度。或者,改用这个:@Joe,谢谢你的链接!仅仅添加IsAsync=true
对我来说不起作用,但是添加Converter={StaticResource IdentityConverter}
(以及转换器本身)就成功了@马丁,谢谢你的更新!我没有意识到我的应用程序仍然在.NETFramework3.5上。切换到.NET Framework 4确实解决了我的问题,因此没有添加IsAsync=…
或Converter=…
:]是的。但在.NET3.5中更改文本框输入时不会发生任何事情