Почему содержимое чистого IEnumerable невидимо для WPF DataGrid? - PullRequest
3 голосов
/ 23 августа 2010

Допустим, у меня есть сетка данных с источником данных, привязанным к свойству Collection, например IEnumerable. Конечно, я написал соответствующий метод получения и установки для него.

Теперь, когда я присваиваю этому свойству (Collection) просто IEnumerable (как результат какого-то метода), например:

Collection = FooMethod(); // FooMethod returns IEnumerable<MyClass>

datagrid будет отображать пустые строки. Количество строк будет соответствовать количеству коллекции.

Но когда я принудительно преобразую, вот так:

Collection = FooMethodp().ToArray(); // forced fetching data

datagrid покажет все строки с содержимым.

Так что же мешает сетке данных показывать данные в случае чистого IEnumerable? Он должен перебирать коллекцию, поэтому выборка происходит в любом случае.

редактирует

Только для записи. MyClass это:

public class ErrorsIndicators
{
    public double Min { get; set; }
    public double Max { get; set; }
    public double Avg { get; set; }
}

и FooMethod возвращает (возвращает доход) несколько позиций. Так что здесь ничего особенного.

1 Ответ

5 голосов
/ 23 августа 2010

Трудно сказать, не видя реализацию 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;
        }
    }
}

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>

Если вы удалите DataGrid.Columns из XAML, он отобразит три пустых строки. Таким образом, создается впечатление, что не перечисление источника данных нарушается, когда источник реализует только IEnumerable<T>, а скорее автоматическое создание столбцов.

...