问题描述
我正在寻找将 Avalonia DataGrid.Items
与 ObservableCollection<SomeType[]>
集合绑定的方法。因此,行是 SomeType[]
数组,其中每个元素都是 DataGrid
单元格的值。是否有可能?现在它绑定类 Array 的字段而不是绑定元素,我知道,这是一种常见的方式。但是当我不知道它可以占用多少列时,我需要动态地进行。像 .NET 中的 DataTable.defaultview
和 DataGrid
。
在我的 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>
然后,如果我像这样指定 Grid
的 ItemsSource
:
public MainWindow()
{
InitializeComponent();
var dataSource = new ObservableCollection<string[]>
{
new []{ "A","B","C"},new []{ "C","A"},};
Grid.ItemsSource = dataSource;
}
然后我会看到以下结果:
因此,它显示数组的属性而不是它们的内容。
为了列出它们的内容,您需要手动将列添加到 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;
}