为什么在Avalonia的 DataGrid中会出现栈溢出?

后端开发 2026-07-12

以下代码在我尝试加载数据时会导致堆栈溢出异常。

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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章