Wpf 用于小双精度双向绑定的数据输入

Wpf 用于小双精度双向绑定的数据输入,wpf,xaml,wpfdatagrid,Wpf,Xaml,Wpfdatagrid,我正在开发一个应用程序,它可以导入一些自定义的财务数据,用户需要能够对数字进行一些小的更改,以使交易保持平衡。(有时,一个或另一个系统中的舍入误差会导致不平衡,需要手动调整)。错误发生在我无法控制的两个系统之间,而变化的本质需要一个人来决定要做出什么样的变化 我已经让数据绑定开始工作了,只是在输入数据时有一个巨大的麻烦。如果用户想要输入一个非常小的负数,那么输入会一直覆盖他们的输入,以删除负号和小数点 例如:如果我尝试不停地键入“-0.06”,结果只会是“6”。如果我在6点之前停下来。如果我输入

我正在开发一个应用程序,它可以导入一些自定义的财务数据,用户需要能够对数字进行一些小的更改,以使交易保持平衡。(有时,一个或另一个系统中的舍入误差会导致不平衡,需要手动调整)。错误发生在我无法控制的两个系统之间,而变化的本质需要一个人来决定要做出什么样的变化

我已经让数据绑定开始工作了,只是在输入数据时有一个巨大的麻烦。如果用户想要输入一个非常小的负数,那么输入会一直覆盖他们的输入,以删除负号和小数点

例如:如果我尝试不停地键入“-0.06”,结果只会是“6”。如果我在6点之前停下来。如果我输入了'-0.0',并且意识到有些事情搞砸了,那么就只有一个'0'。可以输入所需的值,但我需要进行一系列编辑,如“1006”、“10.06”、“0.06”、“-0.06”。这不是很有成效,也很难教别人去做

my templatecolumn的XAML如下所示:

<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");
        }
    }
}