将ItemsSource绑定到EntityFramework ObjectSet <t>不会生成内容</t>

时间:2012-01-03 09:08:58

标签: c# wpf entity-framework data-binding

我们的应用程序在XAML中使用了几个TreeViewItem和DataGrid控件,其ItemsSource属性绑定到Entity Framework ObjectSet<Entity>集合。问题是UI控件的行为就好像ObjectSet是空的。

EF ObjectContext包含在静态类的单例类中:

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

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

并且从单例中的只读属性返回ObjectSet:

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

最后,ItemsSource是绑定到集合的数据,当知道数据源已更新时,INotifyPropertyChanged用于更新UI:

<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 Binding相同的行为发生:什么都没有。但是:

PART_TVI.ItemsSource = BusinessData.Source.RetiredEmployees.ToArray();
啊,哈哈!现在,我们在TreeViewItem中生成了内容。但是,为什么这首先是必要的呢?

1 个答案:

答案 0 :(得分:0)

我的猜测是:在IEnumerable的情况下,将表达式传递给ItemsSource,而不是SOURCE。当你调用:ToArray()这意味着,它将执行表达式并返回ItemsSource的实际数据。

总结一下,第一种情况:你告诉WPF如何获取ItemsSource。第二种情况:您传递实际数据源。