WPF DataGrid - DataGridTextColumn decimal/double/float input with PropertyChanged

问题描述 投票:0回答:3

我在 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(与删除它相同)或尝试 输入“.”而你后面还有其他数字。

c# wpf data-binding datagrid
3个回答
1
投票

一个老问题,但我想分享一个奇怪的解决方案:) 通过“UpdateSourceTrigger=LostFocus”更改“UpdateSourceTrigger=PropertyChanged”将允许十进制值。


0
投票

我做了很多研究,但没有找到解决方案。所以选择选项 3 - 允许字符串输入并在后端处理它。


0
投票

你可以试试这个,在 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}" >
© www.soinside.com 2019 - 2024. All rights reserved.