为什么在Avalonia的 DataGrid中会出现栈溢出?
以下代码在我尝试加载数据时会导致堆栈溢出异常。
MainWindow.axaml:
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:SalesApp.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="SalesApp.Views.MainWindow"
x:DataType="vm:MainWindowViewModel"
Icon="/Assets/avalonia-logo.ico"
Title="SalesApp">
<Design.DataContext>
<vm:MainWindowViewModel/>
</Design.DataContext>
<Border Classes="card">
<StackPanel Spacing="10">
<TextBlock Text="{Binding DateSales.Count, StringFormat='عدد الأيام: {0}'}" Classes="title"/>
<Button Content="AddNew" Command="{Binding LoadDataCommand}"/>
<DataGrid ItemsSource="{Binding DateSales, Mode=OneWay}"
AutoGenerateColumns="False"
IsReadOnly="True"
CanUserReorderColumns="True"
CanUserResizeColumns="True"
CanUserSortColumns="True"
GridLinesVisibility="All">
<DataGrid.Columns>
<DataGridTextColumn Header="التاريخ" Binding="{Binding Date, StringFormat='{}{0:dd-MM-yyyy}'}"/>
<DataGridTextColumn Header="عدد الطلبات" Binding="{Binding OrderCount}"/>
<DataGridTextColumn Header="إجمالي الإيرادات" Binding="{Binding TotalRevenue}"/>
<DataGridTextColumn Header="عدد المنتجات" Binding="{Binding ItemsCount}"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</Border>
</Window>
MainWindowViewModel.cs:
namespace SalesApp.ViewModels;
using System;
using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
public class SalesByDateDto
{
public DateTime Date { get; set; }
public int OrderCount { get; set; }
public decimal TotalRevenue { get; set; }
public int ItemsCount { get; set; }
}
public partial class MainWindowViewModel : ViewModelBase
{
[ObservableProperty]
private ObservableCollection<SalesByDateDto> dateSales = new();
public string Greeting { get; } = "Welcome to Avalonia!";
[RelayCommand]
private void LoadData()
{
// Simulate loading data
DateSales = new ObservableCollection<SalesByDateDto>
{
new SalesByDateDto { Date = DateTime.Today, OrderCount = 10, TotalRevenue = 1000m, ItemsCount = 50 },
new SalesByDateDto { Date = DateTime.Today.AddDays(-1), OrderCount = 8, TotalRevenue = 800m, ItemsCount = 40 },
new SalesByDateDto { Date = DateTime.Today.AddDays(-2), OrderCount = 12, TotalRevenue = 1200m, ItemsCount = 60 }
};
}
}
app.axmal:
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SalesApp.App"
xmlns:local="using:SalesApp"
RequestedThemeVariant="Default">
<!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
<Application.DataTemplates>
<local:ViewLocator/>
</Application.DataTemplates>
<Application.Styles>
<FluentTheme />
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/>
</Application.Styles>
</Application>
如何重现这个问题
- Avalonia版本是
11.3.12 - 操作系统是
Ubuntu 24.04.4 LTS
dotnet new avalonia.mvvm -o SalesApp
cd SalesApp
dotnet package update
dotnet package add Avalonia.Controls.DataGrid
然后用上面显示的代码和标记替换这些文件。
解决方案
问题的根源在于 StringFormat,我通过添加OneWay Binding来修复它。
<DataGridTextColumn Header="التاريخ" Binding="{Binding Date, Mode=OneWay, StringFormat='{}{0:dd-MM-yyyy}'}"/>
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。