Wpf 用于小双精度双向绑定的数据输入
我正在开发一个应用程序,它可以导入一些自定义的财务数据,用户需要能够对数字进行一些小的更改,以使交易保持平衡。(有时,一个或另一个系统中的舍入误差会导致不平衡,需要手动调整)。错误发生在我无法控制的两个系统之间,而变化的本质需要一个人来决定要做出什么样的变化 我已经让数据绑定开始工作了,只是在输入数据时有一个巨大的麻烦。如果用户想要输入一个非常小的负数,那么输入会一直覆盖他们的输入,以删除负号和小数点 例如:如果我尝试不停地键入“-0.06”,结果只会是“6”。如果我在6点之前停下来。如果我输入了'-0.0',并且意识到有些事情搞砸了,那么就只有一个'0'。可以输入所需的值,但我需要进行一系列编辑,如“1006”、“10.06”、“0.06”、“-0.06”。这不是很有成效,也很难教别人去做 my templatecolumn的XAML如下所示:Wpf 用于小双精度双向绑定的数据输入,wpf,xaml,wpfdatagrid,Wpf,Xaml,Wpfdatagrid,我正在开发一个应用程序,它可以导入一些自定义的财务数据,用户需要能够对数字进行一些小的更改,以使交易保持平衡。(有时,一个或另一个系统中的舍入误差会导致不平衡,需要手动调整)。错误发生在我无法控制的两个系统之间,而变化的本质需要一个人来决定要做出什么样的变化 我已经让数据绑定开始工作了,只是在输入数据时有一个巨大的麻烦。如果用户想要输入一个非常小的负数,那么输入会一直覆盖他们的输入,以删除负号和小数点 例如:如果我尝试不停地键入“-0.06”,结果只会是“6”。如果我在6点之前停下来。如果我输入
<DataGridTemplateColumn Header="Amount">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=LineAmount, Mode=OneWay, StringFormat=C2}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=LineAmount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
有什么建议吗?我已经尝试过定制
IValueConverter
实现,但仍然存在相同的问题。我认为直接绑定到double就是问题所在。思考一下,当您第一次键入“-”时,它不能转换为双精度,因此无法应用字符串格式,从而破坏了它。在运行期间,您可能可以在VisualStudio的输出
窗口中看到这一点。相反,创建一个将从字符串转换为double的backing属性,然后更新double金额
<DataGridTemplateColumn Header="Amount">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=LineAmount, Mode=OneWay, StringFormat=C2}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=LineAmountStr, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
数据绑定或类型没有问题。转换行为工作正常,我的程序执行了它应该执行的操作,问题似乎在于输入行为。处理财务数字时使用
十进制
。数字从十进制开始,但结果是双重的,因为它随后被传递到一个odata服务,该服务允许我在不使用QuickBooks SDK的情况下与QuickBooks进行交互(QuickBooks SDK的文档记录很差)。wcf服务引用生成的类需要一个双值。如果将updatesourcetrigger更改为lostfocus,会发生什么情况?我将很快尝试一下。由于从概念到产品有两周的最后期限,我走了一些弯路,所以我现在直接绑定到模型。我将设置一个ViewModel,看看这是否解决了问题(看起来会)。@Balrog30虽然它可能不是纯MVVM,但您可以在您的模型中实现它并进行测试。这将很困难,因为该模型是一个生成的数据服务。我可能会继承它,但我最好只是构建视图模型,无论如何这是更好的实践。我写了很多乱七八糟的代码只是为了让它工作,是时候做一些重构了。目前,我通过更改LostFocus
的UpdateSourceTrigger
使该功能正常工作。我遇到的一个问题是,我试图让LineAmount
setter更新LineAmountStr
,这导致了StackOverflowException
(顺便说一句,尝试在谷歌上搜索一下……StackOverflow有点扼杀了它)。不过,现在一切都很好。非常感谢。
public class TheViewModel
{
private string _lineAmountStr;
public string LineAmountStr
{
get { return _lineAmountStr; }
set
{
double amt;
if(double.TryParse(value, out amt))
{
LineAmount = amt;
}
_lineAmountStr = value;
NotifyPropertyChanged("LineAmountStr");
}
private double _lineAmount;
public double LineAmount
{
get { return _lineAmount; }
set
{
_lineAmount = value;
NotifyPropertyChanged("LineAmount");
}
}
}