Привязка ItemsSource к EntityFramework ObjectSet <T>не создает контент - PullRequest
0 голосов
/ 03 января 2012

Наше приложение использует несколько элементов управления TreeViewItem и DataGrid в XAML, чьи свойства ItemsSource связаны с коллекциями Entity Framework ObjectSet<Entity>.Проблема заключается в том, что элементы управления пользовательского интерфейса ведут себя так, как будто наборы объектов пусты.

EF ObjectContext заключен в одноэлементный класс в статическом классе:

public static class BusinessData
{
    public static readonly BizDataSource Source = BizDataSource.Instance;
}

public class BizDataSource : INotifyPropertyChanged
{
    private BusinessEntitiesObjectContext _context = ...;

и наборы объектоввозвращаются из свойств только для чтения в синглтоне:

    public IEnumerable<Employee> RetiredEmployees
    {
        get { 
            return (from it in _context.Employees where it.Status == "Retired" select it);  
        }
    }

и, наконец, ItemsSource является данными, привязанными к коллекции, а INotifyPropertyChanged служит для обновления пользовательского интерфейса, когда известно, что источник данных обновлен:

<TreeViewItem x:Name="PART_TVI" Header="Retired Employees"
     ItemsSource="{Binding 
       Source={x:Static local:BusinessData.Source}, 
       Path=RetiredEmployees}" 
/>

Пошаговая отладка показала, что привязка правильно предоставляет IEnumerable, который разрешается в бизнес-объектах, но кажется, что элемент управления не выполняет итерации по нему.Например, если я добавлю этот код в окно:

PART_TVI.ItemsSource = BusinessData.Source.RetiredEmployees;

Будет происходить то же поведение, что и для привязки XAML: ничего.Однако:

PART_TVI.ItemsSource = BusinessData.Source.RetiredEmployees.ToArray();

Ах, ха!Теперь мы сгенерировали контент в нашем TreeViewItem.Но почему это было необходимо в первую очередь?

1 Ответ

0 голосов
/ 03 января 2012

Я предполагаю, что: в случае IEnumerable вы передаете выражение в ItemsSource, а не в SOURCE.Когда вы вызываете: ToArray (), что означает, что он выполнит выражение и вернет фактические данные для ItemsSource.

Итак, первый случай: вы сообщаете WPF, как получить ItemsSource.Второй случай: вы передаете фактический источник данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...