为什么纯IEnumerable的内容对于WPF DataGrid是不可见的?

gre*_*man 3 c# data-binding wpf ienumerable datagrid

假设我有一个带有itemsource绑定到属性Collection的datagrid,例如IEnumerable.当然我为它写了适当的getter和setter.

现在,当我分配给这个属性(Collection)时只是IEnumerable(作为某种方法的结果),如:

Collection = FooMethod(); // FooMethod returns IEnumerable<MyClass>
Run Code Online (Sandbox Code Playgroud)

datagrid将显示空行.行的计数将与Collection的计数匹配.

但当我强制转换时,像这样:

Collection = FooMethodp().ToArray(); // forced fetching data
Run Code Online (Sandbox Code Playgroud)

datagrid现在将显示包含内容的所有行.

那么什么阻止数据网格在纯IEnumerable的情况下显示数据呢?它必须迭代一个集合,所以无论如何都要进行提取.

编辑

仅供记录.MyClass是这样的:

public class ErrorsIndicators
{
    public double Min { get; set; }
    public double Max { get; set; }
    public double Avg { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和FooMethod返回(返回yield)几个项目.所以,这里没什么特别的.

Ken*_*art 5

很难说没有看到实现FooMethod(),但我怀疑它正在返回一些实现IEnumerable<T>但没有进一步的东西(比如ICollection<T>IList<T>).在这种情况下,似乎DataGrid无法动态确定列名称,您需要通过DataGrid.Columns属性自己告诉它.

这是我放在一起的一个简单的复制品.

MainWindow.xaml.cs:

namespace DataGridTest
{
    using System.Collections.Generic;
    using System.Windows;

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Customers = this.GetCustomers();
            DataContext = this;
        }

        private IEnumerable<Customer> GetCustomers()
        {
            yield return new Customer() { Name = "first" };
            yield return new Customer() { Name = "second" };
            yield return new Customer() { Name = "third" };
        }

        public IEnumerable<Customer> Customers
        {
            get;
            set;
        }
    }

    public class Customer
    {
        public string Name
        {
            get;
            set;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

MainWindow.xaml:

<Window x:Class="DataGridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DataGrid ItemsSource="{Binding Customers}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        </DataGrid.Columns>
    </DataGrid>
</Window>
Run Code Online (Sandbox Code Playgroud)

如果DataGrid.Columns从XAML中删除它,它将显示三个空行.因此,当源仅实现时IEnumerable<T>,它似乎不是数据源的枚举,而是自动列创建.