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

von4xj4u  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(156)

我在DataGridTextColumn中使用UpdateSourceTrigger=PropertyChanged时遇到十进制(double/float)输入问题。
(1)我已经搜索了几个网站,许多人建议将其更改为LostFocus。我不是很热衷于这种实现的原因与PropertyChanged的行为是我所需要的。除非有一种方法可以得到同样的结果与LostFocus??
我读过以下关于stackoverflow的文章-Link 1Link 2Link 3Link 4Link 5 & Link 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(与删除它相同)或尝试键入'。而后面还有其他数字

5tmbdcev

5tmbdcev1#

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

vx6bjr1n

vx6bjr1n2#

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

1tu0hz3e

1tu0hz3e3#

你可以试试这个,在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}" >

相关问题