我们的应用程序在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中生成了内容。但是,为什么这首先是必要的呢?
答案 0 :(得分:0)
我的猜测是:在IEnumerable的情况下,将表达式传递给ItemsSource,而不是SOURCE。当你调用:ToArray()这意味着,它将执行表达式并返回ItemsSource的实际数据。
总结一下,第一种情况:你告诉WPF如何获取ItemsSource。第二种情况:您传递实际数据源。