我在 DataGridTextColumn 中使用 UpdateSourceTrigger=PropertyChanged 进行小数(双精度/浮点)输入时遇到问题。
(1) 我已经搜索了几个站点,许多站点建议将其更改为 LostFocus。我不太喜欢这个实现,因为 PropertyChanged 的行为是我所需要的。除非有办法用 LostFocus 获得相同的结果??
我已经阅读了以下关于 stackoverflow 的文章 - 链接 1, 链接 2, 链接 3, 链接 4, 链接 5 & 链接 6
(2) 使用
Binding="{Binding StringFormat=N2}"
或其变体具有非常烦人的行为,如 Link 4 中的评论所述。
(3) 另一种方法是允许字符串输入,在后端解析为double。这很好,我坚持把它作为最后的解决方案。
(4) 最后在同一个 Link 4 中,xmedeko 提到的解决方案 -
System.Windows.FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false;
仅适用于 .NET 4.5 或更高版本。
我确实有更新的版本,但不确定如何/在哪里实现这行代码。或者是否有办法在 XAML 本身中将此属性设为 false?任何帮助是极大的赞赏。由于我的声誉水平,无法回复该链接的评论。
如果在保持类似于 PropertyChanged 的行为的同时还有任何其他更简洁的方法,将非常有帮助。
代码
XAML-
<DataGridTextColumn Header="Rate" Binding="{Binding Path=Rate, UpdateSourceTrigger=PropertyChanged}" Width="90"/>
cs-
public void NotifyPropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
public double Rate
{
get { return rate; }
set { rate = value; NotifyPropertyChanged("Rate"); }
}
代码其实很简单。这显示在数据网格上。 DataGridTextColumn 不接受小数值,Chevul Ervin 在 Link 2 -
中正确指出了这一点UpdateSourceTrigger=PropertyChanged 重新计算每个文本 击键。以小数点结尾的数字无效。改变 将 UpdateSourceTrigger 设置为 LostFocus(与删除它相同)或尝试 输入“.”而你后面还有其他数字。
一个老问题,但我想分享一个奇怪的解决方案:) 通过“UpdateSourceTrigger=LostFocus”更改“UpdateSourceTrigger=PropertyChanged”将允许十进制值。
我做了很多研究,但没有找到解决方案。所以选择选项 3 - 允许字符串输入并在后端处理它。
你可以试试这个,在 WPF App 构造函数中添加这段代码。
public App()
{
FrameworkCompatibilityPreferences
.KeepTextBoxDisplaySynchronizedWithTextProperty = false;
}
或者如果使用
Binding
,请尝试添加 Delay
,例如 1 或 2 秒。这将在验证开始之前延迟验证。
<DataGridTextColumn
Header="Age"
Binding="{Binding Path=Age, Delay=1000,
Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=true}" >