【发布时间】:2011-07-27 22:02:43
【问题描述】:
我检查了大约 60 个国家/地区的邮政编码。用户输入一个邮政编码,该邮政编码会根据该国家/地区的规则进行检查。美国是一个例外,我可以根据已输入的其他街道地址信息自动填充值。在某些方面,它基本上是一种自动更正功能。问题是如果自动填充的值与之前的 .Text 值匹配,则永远不会重新显示 - 用户刚刚输入的“错误”邮政编码仍然显示!
例如,字段包含“12345”,用户删除“5”,我的属性设置器将值放回“12345”,绑定getter返回“12345”(此时我的_TextChanged事件触发)但WPF仍然显示用户编辑的文本“1234”!
如何强制 WPF 重新显示该值?
为了简化示例,我对 ZipCode 值进行了硬编码(在应用程序中它以单独的方法计算):
public String ZipCode
{
get { return _address.ZipCode; }
set
{
_address.ZipCode = "12345";
RaisePropertyChanged("ZipCode");
}
}
这是 XAML:
<TextBox Name="ZipBox"
Text="{Binding Path=ZipCode, UpdateSourceTrigger=PropertyChanged}"
TextChanged="ZipBox_TextChanged" />
WPF 知道该字段已更改,因为它总是触发此事件。但是这些方法都没有强制 WPF 正确显示“12345”。
private void ZipBox_TextChanged(object sender, TextChangedEventArgs e)
{
ZipBox.InvalidateVisual();
ZipBox.InvalidateMeasure();
ZipBox.UpdateLayout();
}
编辑:我还创建了一个自定义静态扩展方法 .Refresh(this UIElement uiElement) 调用 UIElement.Dispatcher.Invoke() 并且也不会强制重绘。
【问题讨论】:
-
什么是 ZipBox? ZipCode 属性在哪里?您不需要实际更改 ZipCode 属性吗?你不应该在 TextChanged 事件中这样做吗?什么更新了 ZipCode 属性?