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?
)。
我有一个 (.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?
)。