小双程双向绑定的数据输入

时间:2014-08-20 18:58:10

标签: wpf xaml wpfdatagrid

我正在开发一个执行某些自定义财务数据导入的应用程序,并且用户需要能够对数字进行少量更改以使事务平衡。 (有时在一个系统或另一个系统中舍入错误会导致不平衡,需要手动调整)。错误发生在我无法控制的两个系统之间,而变更的性质需要人来决定要做出哪些改变。

我已经让数据绑定工作,除了输入数据时有一个很大的烦恼。如果用户想要输入一个非常小的负数,输入将继续覆盖其输入以删除负号和小数位。

例如:如果我尝试不停止地键入'-0.06',我最终只得到'6'。如果我在到达6之前停止。如果我输入'-0.0'并且意识到某些事情搞砸了,那么所有的都是'0'。可以输入所需的值,但我需要进行一系列编辑,如'1006','10.06','0.06',' - 0.06'。这不是很有效率,也很难教别人去做。

我的模板列的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,但仍然遇到同样的问题。

1 个答案:

答案 0 :(得分:1)

我认为直接绑定到双重是给你问题的原因。想一想,当你第一次输入“ - ”表示无法转换为double时,所以不能应用字符串格式,打破它。您可以在运行时期间在Visual Studio的Output窗口中看到此内容。相反,创建一个支持属性,它将从字符串转换为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>

您的视图模型类:

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