我在DataGridTextColumn中使用UpdateSourceTrigger=PropertyChanged时遇到十进制(double/float)输入问题。
(1)我已经搜索了几个网站,许多人建议将其更改为LostFocus。我不是很热衷于这种实现的原因与PropertyChanged的行为是我所需要的。除非有一种方法可以得到同样的结果与LostFocus??
我读过以下关于stackoverflow的文章-Link 1,Link 2,Link 3,Link 4,Link 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(与删除它相同)或尝试键入'。而后面还有其他数字
3条答案
按热度按时间5tmbdcev1#
一个老问题,但我想分享奇怪的解决方案:)将“UpdateSourceTrigger=PropertyChanged”更改为“UpdateSourceTrigger=LostFocus”将允许十进制值。
vx6bjr1n2#
我做了很多研究,没有找到解决办法。所以选择3 -允许字符串输入并在后端处理它。
1tu0hz3e3#
你可以试试这个,在WPF App构造函数中添加这段代码。
或者,如果使用
Binding
,请尝试添加Delay
,例如1或2秒。这将在验证开始之前延迟验证。