gpt4 book ai didi

c# - WPF TextBox 显示的值不等于 TextBox.Text

转载 作者:太空宇宙 更新时间:2023-11-03 17:06:09 32 4
gpt4 key购买 nike

我检查了大约 60 个国家/地区的邮政编码。用户输入邮政编码,根据该国家/地区的规则进行检查。美国是个异常(exception),我可以根据已输入的其他街道地址信息自动填写值。在某些方面,它基本上是一种自动更正功能。问题是,如果自动填充值与之前的 .Text 值匹配,则它永远不会重新显示 - 用户刚刚输入的“错误”邮政编码仍然显示!

例如,字段包含“12345”,用户删除了“5”,我的属性 setter 将值放回“12345”,绑定(bind) 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() 并且也不会强制重绘。

最佳答案

Microsoft 论坛上的 Min Zhu 提出了一个解决方案。这是代码:

bool flagTextChanged = true;
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox txt = sender as TextBox;
if (flagTextChanged && txt != null)
{
flagTextChanged = false;
Binding b = BindingOperations.GetBinding(txt, TextBox.TextProperty);
if (b != null)
{
txt.ClearValue(TextBox.TextProperty);
BindingOperations.SetBinding(txt, TextBox.TextProperty, b);
}
flagTextChanged = true;
}
}

关于c# - WPF TextBox 显示的值不等于 TextBox.Text,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5517599/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com