如何将“DataGrid.Items”与 ObservableCollection<SomeType[]> 绑定?

问题描述

我正在寻找将 Avalonia DataGrid.ItemsObservableCollection<SomeType[]> 集合绑定的方法。因此,行是 SomeType[] 数组,其中每个元素都是 DataGrid 单元格的值。是否有可能?现在它绑定类 Array 的字段而不是绑定元素,我知道,这是一种常见的方式。但是当我不知道它可以占用多少列时,我需要动态地进行。像 .NET 中的 DataTable.defaultviewDataGrid

在我的 XAML 中,它看起来像这样:

<DataGrid AutoGenerateColumns="True" Items="{Binding Rows}"/>

其中 Rows 在我的视图模型中是 ObservableCollection<string[]> Rows { get; set; }

解决方法

简而言之:您不能通过 AutoGenerateColumns 做到这一点。

假设我有这个简化的用户界面:

<Window x:Class="_Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DataGrid x:Name="Grid"></DataGrid>
    </Grid>
</Window>

然后,如果我像这样指定 GridItemsSource

public MainWindow()
{
    InitializeComponent();
    var dataSource = new ObservableCollection<string[]>
    {
        new []{ "A","B","C"},new []{ "C","A"},};
    Grid.ItemsSource = dataSource;
}

然后我会看到以下结果:

Arrays' properties are showed

因此,它显示数组的属性而不是它们的内容。


为了列出它们的内容,您需要手动将列添加到 Grid

foreach (var idx in dataSource[0].Select((value,index) => index))
{
    Grid.Columns.Add(new DataGridTextColumn { Header = $"{idx + 1}. column",Binding = new Binding($"[{idx}]") });
}

让我们把所有东西放在一起:

public MainWindow()
{
    InitializeComponent();
    var dataSource = new ObservableCollection<string[]>
    {
        new []{ "A",};

    foreach (var idx in dataSource[0].Select((value,index) => index))
    {
        Grid.Columns.Add(new DataGridTextColumn { Header = $"{idx + 1}. column",Binding = new Binding($"[{idx}]") });
    }

    Grid.AutoGenerateColumns = false;
    Grid.ItemsSource = dataSource;
}

结果将是:
Arrays' content are showed

Credit goes to har07

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...