绑定了Decimal类型的TextBox,UpdateSourceTrigger设置为PropertyChanged。

11

我已经在这个问题上挣扎了一段时间,似乎无法想出一个具体的解决方法 - 我有一个绑定到十进制数值的文本框,绑定的UpdateSourceTrigger属性设置为PropertyChanged,由于必要性,这样设置是必需的(LostFocus在这种情况下行不通)。虽然默认行为可能可以解释,但对我的目的来说不可接受,所以我尝试了以下StringFormat,我原本认为它能够解决问题,但只是部分地,我现在正在寻找更具体的办法。我的原始解决方案是在绑定中添加一个字符串格式...在我的情况下是

StringFormat={0:#.#####} 

当我输入类似于.12345或1.5这样的内容时,解决方案非常好,但是如果我输入.01234,只要按下零键,它就会删除我刚刚输入的小数点......显然,这在数据输入方面将是灾难性的。我希望我的字符串格式化熟练度不够。最坏的情况是我将我的暴露属性设置为字符串,并使setter和getter转换为十进制,但这似乎是一个笨拙的解决方案。

谢谢!

Aj


我理解你的苦衷。在各种项目中,我(以及我们)最终创建了一个NumericTextBox UserControl,能够处理你所描述的情况,以及其他有趣的输入:整数与浮点数、负数、小数、验证(数字与字母)等等。根据你的文本框需求的复杂程度,我建议你创建自己的NumericTextBox,继承自TextBox并添加你的规则。祝你好运! - denis morozov
2
@denismorozov - 虽然我没有想出一个合法的解决方案,但我读到了另一篇文章,其中有人建议在按钮上设置FocusManager.IsFocusScope="False",以将焦点从文本框中移开,在我的情况下,这使我能够从使用属性更改回到失去焦点的默认状态,因为它会在按钮命令执行之前执行我的绑定。这可能不是你的解决方案,但至少在这种情况下对我有效。 - Aaj
哦,有趣,我会尝试一下! - denis morozov
1
@denismorozov - 另外,如果您不希望按钮在单击后保持焦点,可以使用FocusManager.IsFocusScope与FocusManager.FocusedElement结合使用,并将其设置为可以接收焦点的控件...这样您的按钮就不会在单击后保持突出显示...也可以在其他需要时移动焦点的情况下提供良好的方式。 - Aaj
2个回答

1
我发现这个问题是因为我遇到了一个 .Net 4.6.2 构建的相同问题。我需要输入一个汇率,例如1.15,但发现小数点被删除后变成了115。我的解决方法是绑定到一个字符串属性,该属性在输入时保持自己的字符串值,例如1、1.、1.1、1.15。但是每次尝试输入时都会在 Try Catch 中更新底层数值属性。这远非优雅,但对我的需求有效。

0

你有两个简单的选择来实现你想要的:

  1. 尝试先输入一个“0”...你可以毫无问题地输入“0.01234”。

  2. 使用StringFormat={}{0:0.00000}代替...然后你就可以毫无问题地输入“.01234”了。


1
谢谢您的回复 - 自从我们完成了相关应用程序并遇到这个问题以来已经有一段时间了。话虽如此,在您提出的解决方案中,期望用户始终首先输入零是不现实的,特别是知道如果他们忘记了,它会真正破坏数字。您发布的第二个建议很好,但如果回忆起来(已经过了一段时间),在.Net 3.5上也无法解决这个问题 - 可能已经在随后的版本中更改...但当时我们无法使其工作。 - Aaj
没有解决方案,这就是为什么它仍然存在的原因...我相当确定这是 .Net 3.5 中的一个 bug,他们从未真正考虑过也没有修复...如果有人有一个有效的解决方案,我很乐意听取,因为这是困扰我数月的问题。 - Aaj
1
我刚刚给了你一个可行的解决方案...我刚刚在.NET 3.5上测试过,仍然可以正常工作。你可以自己试试。否则,你还在等待什么神奇的解决方案呢? - Sheridan
我尝试了您的解决方案,结果完全相同...您使用的是哪个版本的. Net 3.5?请发布您的XAML和CS文件,其中您可以持续工作。我们的设置是MVVM,在VM中绑定属性,该属性正在获取/设置十进制数,确保将更新源触发器设置为属性更改。如果您测试并使其正常工作,我会非常感兴趣看到它,因为当我去年研究这个问题时,这困扰着我们和许多其他人。 - Aaj
2
我理解字符串格式之间的区别,并尝试过两种格式。问题特别出现在updatesourcetrigger被设置为propertychanged时 - 当您输入时,它会尝试更新绑定,这可能会搞砸事情...只是一个猜测。在您的测试用例中,您是否确保将updatesourcetrigger设置为propertychanged?我已经尝试了几次,但仍然没有运气。 - Aaj
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接