全部,
我正在使用数据库优先实体框架 v4.4。在数据库(和数据模型)中是 Table1,它与 Table2 具有 1:many 关系。
我将 WPF 中的 DataGrid 绑定到 Table1.Local.First().Table2 (为简单起见,假设 Table1.Local 中有一个实体开始)。
视图模型:
Public SomeEntityDBContextWithTable1AndTable2 Container { get; set; }
Public ICollection Table2ToDisplay { get { return Container.Table1.Local.First().Table2; } } //Note: :Many navigation properties return ICollection<T>, but the object type is of ObservableCollection<T>.
在 XAML 中,我有以下内容
<GroupBox Header=Table2 DataContext="{Binding Path=Table2ToDisplay, UpdateSourceTrigger=PropertyChanged}">
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" CanUserAddRows="True">
<DataGrid.Columns>
<!--A bunch of columns-->
</DataGrid.Columns>
</DataGrid>
</GroupBox>
在恰好是文本框的 NewItemPlaceHolder 内单击时,我得到了 PresentationFramework.dll 中发生的 System.InvalidOperationException。这不会使我的应用程序崩溃,但我会在输出中看到它。我的猜测是实体是在另一个线程上添加的,因此 CollectionChanged 事件会在另一个线程上触发,这会导致 InvalidOperationException。但是,由于代码主要是通过 XML 完成的,我似乎找不到处理这个异常的方法(或者它已经被处理了,只是它正在被报告给输出)。是否有一种安全的方法可以将 CanUserAddRows="True" 与 EntityFramework 一起使用,其中“:Many”导航属性的类型为 ObservableCollection?
我应该指出,我还尝试将 Table2ToDisplay 属性包装在 CollectionViewSource 中,但我仍然在输出中看到 InvalidOperationException。
提前致谢。