Avalonia DataGrid 在排序之前看起来是空的

问题描述 投票:0回答:2

我正在使用 AvaloniaUI 11.0.0-preview7、.NET 7、MVVM 社区工具包。

实例化

DataGrid
并将
ItemsSource
绑定到
ObservableCollection
时,它会显示为空,直到我对列进行排序。

查看:

<DataGrid Name="MyDataGrid" ItemsSource="{Binding Lines}">
  <DataGrid.Columns>
    <DataGridTextColumn Header="Index" Binding="{Binding Index}" IsReadOnly="True" Width="*"/>
    [...]
  </DataGrid.Columns>
</DataGrid>

视图模型:

public class MainWindowViewModel : ViewModelBase
{
    public ObservableCollection<LineViewModel> Lines { get; set; }

    public MainWindowViewModel() {
        _lineViewModel = new LineViewModel();
        Lines = new ObservableCollection<LineViewModel>() {_lineViewModel };
    }

    private LineViewModel _lineViewModel;
}

public partial class LineViewModel : ViewModelBase {

    public LineViewModel()
    {
        Option = new ObservableCollection<string>() { "Foo", "Bar" };
    }

    [ObservableProperty]
    private int _index;

    public ObservableCollection<string> Option { get; set; }
}

我看不出我正在做的事情与在线资源有什么不同,也不知道是什么导致了这种行为。 调试

Lines
getter 确认它被调用一次,并在此之前使用一个
LineViewModel
项进行初始化。

我创建了一个示例项目来隔离该问题:https://github.com/JulienBernard3383279/AvaloniaPad

为什么数据网格最初显示为空?

c# mvvm datagrid avaloniaui
2个回答
1
投票

在我的例子中,这是因为我将 DataGrid 放在 StackPanel 中,并且在添加项目时它没有调整 DataGrid 的大小。设置高度似乎可以修复它。


0
投票

我在查看类似问题时偶然发现了这个问题。

JellyO的评论解决了这个问题。但我不想明确设置高度。

所以我玩了一下,想分享结果,以防其他人不想明确设置高度。

问题:

当 TabControl 内的

DataGrid
内有
StackPanel
且方向设置为垂直时,DataGrid 最初显示为空。

调整窗口大小后,它就被修复了。 在 TabControl 中切换选项卡时,它是固定的。 但是:当从表包含 1 个项目的选项卡切换到表应包含 2 个项目的选项卡时,只会显示 1 个项目。

我从玩耍中学到的东西

学习1:StackPanel方向

这个问题好像只有当

StackPanel.Orientation
设置为
Vertical
时才会出现。

学习2:如果垂直,嵌套并不重要

我尝试过多种嵌套深度和嵌套星座。问题仍然存在,如果在 DataGrid 上方的任何级别上,都有一个方向为

StackPanel
Vertical

学习3:DockPanels

当 DataGrid 位于

DockPanel
中时,也会出现此问题,但前提是
DataGrid
使用
DockPanel.Dock
属性。如果设置为无论如何。这个问题是可以观察到的。

解决方案:

除了明确设置高度(这似乎是 DataGrid 的推荐做法(抱歉,我没有为此保存源代码))之外,还可以在 DataGrid 上设置

VerticalScrollBarVisibility="Visible"

我不知道为什么它会这样做,但这解决了它,没有设置特定的高度。

© www.soinside.com 2019 - 2024. All rights reserved.