WPF中的DataGrid控件,用于显示列表数据,一般来说是很好用的。但是在使用过程中发现,我们发现DataGrid的列单元在绑定数字后,再编辑此列单元时,无法在数字后面键入小数点,这给终端用户带来很大的不便。在网上查了下,很多人碰到这个问题,但没有好的解决办法。
我们可以采用以下语句试验输入效果:
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox HorizontalAlignment="Stretch" Text="{Binding dbValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,NotifyOnTargetUpdated=True}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
经过多次试验,发现可以此单元可以输入任意键盘文字,除了小数点与逗号,当然你可以拷贝小数,也可以在输入整数后,再在中间加入小数点,但就是不能在数字最后加入小数点。还有另一种解决办法是,定义StringFormat格式,但是定义了后,可以输入小数点了,但格式却永远不变,而且用户在输入时变得很怪异,它的小数位只能替换,不能新加(大家可以试试),这与终端使用者的习惯严重不符。个人认为,这就是微软的一个BUG。
那么,有没有更好的解决办法呢?最好的解决办法是,自己写一个控件,替代原来的TextBox控件。比如自定义一个控件,继承TextBox:
public class NumericBox : TextBox
在绑定到Text时,仍然不成功。结论是,TextBox这个基础控件被DataGrid锁定,不绕开这个TextBox.Text属性的数字绑定,就不可能实现输入小数点的功能。
解决办法是,自定义一个标准属性,绑定双向数字,再将数字转换为字符串,将字符串显示在TextBox.Text中。即:
public new string Text
{
get
{
return base.Text;
}
set
{
m_decText = helper.FieldToDecimal(value);
decimal d = Math.Round(m_decText, this.Decimal);//舍入小数位数
base.Text = d.ToString();
}
}
经测试,OK了。