【问题标题】:How to bind "DataGrid.Items" with ObservableCollection<SomeType[]>?如何将“DataGrid.Items”与 ObservableCollection<SomeType[]> 绑定?
【发布时间】:2021-04-18 15:10:53
【问题描述】:

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

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

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

Rows 在我的视图模型中是 ObservableCollection&lt;string[]&gt; Rows { get; set; }

【问题讨论】:

  • 为什么不引入域对象?
  • @PeterCsala,我不确定我明白你的意思。你能改写一下吗?
  • 我建议创建一个模型,将数组的每个字符串映射到classstruct 的属性。所以,你应该有ObservableCollection&lt;DomainObject&gt;而不是ObservableCollection&lt;string[]&gt;
  • @PeterCsala,我尝试使用数组而不是域对象,因为属性(在我的情况下为数组项)计数是未知的,可以是任何一个。这取决于用户选择什么表以及它有多少列。它可以是一个表中的 3 或 15 或 1000 列。所以我在寻找动态改变网格列数的方法。

标签: c# xaml binding datagrid avaloniaui


【解决方案1】:

简而言之:您不能通过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", "B", "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", "B", "C"},
        new []{ "C", "B", "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;
}

结果将是:

Credit goes to har07

【讨论】:

  • 这个解决方案对我来说非常有效(顺便说一下在 Avalonia 上)。谢谢!
猜你喜欢
  • 2016-09-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多