You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Avalonia DataGrid无显示问题求助(MVVM项目)

Avalonia DataGrid 无内容渲染的修复方案

1. 消除自动生成列与手动列的冲突

你同时启用了AutoGenerateColumns="True"和手动定义列,这会导致DataGrid的列渲染逻辑冲突,建议关闭自动生成列:

<DataGrid ItemsSource="{Binding Expenses}"
          AutoGenerateColumns="False" <!-- 修改此处 -->
          HorizontalAlignment="Stretch"
          VerticalAlignment="Stretch"
          Margin="20"
          Background="Blue">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Id"  Binding="{Binding Id}"/>
        <DataGridTextColumn Header="Amount" Binding="{Binding Amount}" />
    </DataGrid.Columns>
</DataGrid>

2. 修正ViewModel的属性通知逻辑

你的ViewModel继承了ViewModelBase(CommunityToolkit.Mvvm提供的基类,已实现INotifyPropertyChanged),无需重复声明该接口;同时ObservableCollection本身会自动触发集合变更通知,[ObservableProperty]也会自动生成属性变更通知,无需手动调用OnPropertyChanged:

public partial class AddExpensePageViewModel : ViewModelBase
{
    [ObservableProperty]
    private Expense _newExpense = new Expense();

    [ObservableProperty]
    private List<ExpenseCategory> _categories = GlobalData.Instance.ExpenseCategories;

    [ObservableProperty]
    private ObservableCollection<Expense> _expenses = new ObservableCollection<Expense>(GlobalData.Instance.Expenses);

    public AddExpensePageViewModel()
    {

    }

    [RelayCommand]
    private void AddExpense()
    {
        GlobalData.Instance.Expenses.Add(_newExpense);
        _expenses.Add(_newExpense);
        _newExpense = new Expense();
    }
}

3. 确保Expense类的属性可绑定

Expense类的Id、Amount等属性必须是公共属性,若需要动态更新内容,还需实现INotifyPropertyChanged(推荐使用CommunityToolkit.Mvvm的ObservableObject基类):

public partial class Expense : ObservableObject
{
    [ObservableProperty]
    private int _id;

    [ObservableProperty]
    private decimal _amount;

    // 其他业务属性...
}

4. 调整布局容器避免空间限制

StackPanel的布局特性可能导致DataGrid无法获得足够显示空间,建议将外层容器替换为Grid:

<UserControl ...>
    <UserControl.DataContext>
        <vm:AddExpensePageViewModel/>
    </UserControl.DataContext>
    <Grid>
        <DataGrid ItemsSource="{Binding Expenses}"
                  AutoGenerateColumns="False"
                  HorizontalAlignment="Stretch"
                  VerticalAlignment="Stretch"
                  Margin="20"
                  Background="Blue">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Id"  Binding="{Binding Id}"/>
                <DataGridTextColumn Header="Amount" Binding="{Binding Amount}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</UserControl>

验证步骤

  1. 优先关闭AutoGenerateColumns,这是最常见的冲突原因;
  2. 确认Expense类的属性为公共可访问;
  3. 替换布局容器为Grid,确保DataGrid有足够的显示空间。

内容的提问来源于stack exchange,提问作者spressodev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 23:22:15