EmptyCell:在 AddNew 或 EditItem 事务期间不允许 DeferRefresh

EmptyCell: DeferRefresh is not allowed during an AddNew or EditItem transaction

我有一个 (.NET Framework 4.6.1) wpf-window,其中数据网格绑定到我的 mainwindow 上的一个集合。此集合包含一个 属性 类型的小数。

当我清除单元格时,它会出现红色边框。

这里是 window-构造函数

public WdwSapAccounting()
{
    DataContext = System.Windows.Application.Current.MainWindow.DataContext;
    var x = MainWindow.Reference.CurrentAction.ACCOUNTING_COLLECTION;
    InitialiseComponent();
}

现在我关闭 window(单元格为空)。我重新打开 window 并调试我的 variable x。它说总和仍然是 200。在下一个命令 InitialiseComponent(); 它崩溃并出现错误:

DeferRefresh is not allowed during an AddNew or EditItem transaction

我尝试了 FallBackValue 和 TargetNullValue,但两者都没有捕捉到空单元格,也没有捕捉到这个奇怪的异常。我尝试了 CommitEdit() 和 CancelEdit() 但这也没有帮助:

        private void MetroWindow_Loaded(object sender, RoutedEventArgs e)
    {
        dataGridAccounting.CommitEdit();
        dataGridAccounting.CancelEdit();
    }

    private void MetroWindow_Unloaded(object sender, RoutedEventArgs e)
    {
        dataGridAccounting.CommitEdit();
        dataGridAccounting.CancelEdit();
    }

    private void dataGridAccounting_Loaded(object sender, RoutedEventArgs e)
    {
        dataGridAccounting.CommitEdit();
        dataGridAccounting.CancelEdit();
    }

    private void dataGridAccounting_UnloadingRow(object sender, DataGridRowEventArgs e)
    {
        dataGridAccounting.CommitEdit();
        dataGridAccounting.CancelEdit();
    }

这是我的数据网格的 xml。

 <DataGrid MinHeight="150" Loaded="dataGridAccounting_Loaded" UnloadingRow="dataGridAccounting_UnloadingRow" UnloadingRowDetails="dataGridAccounting_UnloadingRowDetails"
                LoadingRow="DataGridAccounting_LoadingRow" RowStyle="{StaticResource DataGridRowStyle}"
                x:Name="dataGridAccounting" CellEditEnding="dataGridAccounting_CellEditEnding"
                CurrentCellChanged="DataGridAccounting_CurrentCellChanged" Unloaded="dataGridAccounting_Unloaded"
                ItemsSource="{Binding CurrentAction.ACCOUNTING_COLLECTION, UpdateSourceTrigger=PropertyChanged}"
                AutoGenerateColumns="False" >
                </DataGrid.ContextMenu>
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding BETRAG, UpdateSourceTrigger=PropertyChanged, StringFormat=N, FallbackValue=0.0, TargetNullValue=0.0}" Header="BETRAG"/>
                </DataGrid.Columns>
            </DataGrid>

A decimal 属性 不能设置为 null 或空字符串。

您可以使用转换器告诉 WPF 在清除单元格时将其设置回 0.0 (default(decimal)):

public class DecimalConverter : IValueConverter
{
    public string StringFormat { get; set; } = "N";

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
        value;

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
        decimal.TryParse(value?.ToString(), NumberStyles.Any, culture, out decimal d) ? d : default;
}

XAML:

<DataGrid x:Name="dg" AutoGenerateColumns="False" >
    <DataGrid.Resources>
        <local:DecimalConverter x:Key="DecimalConverter" />
    </DataGrid.Resources>
    <DataGrid.Columns>
        ...
        <DataGridTextColumn
                    Binding="{Binding BETRAG, StringFormat=N, FallbackValue=0.0, TargetNullValue=0.0,
                        Converter={StaticResource DecimalConverter}}"
                    Header="BETRAG"/>
    </DataGrid.Columns>
</DataGrid>

或将 BETRAG 的类型更改为 Nullable<decimal> (decimal?)。