Наше приложение использует несколько элементов управления 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.Но почему это было необходимо в первую очередь?