所有
我正在使用DataBase First Entity Framework v4.4。在DB(和数据模型)中,Table1与Table2具有1:多的关系。
我将WPF中的DataGrid绑定到Table1.Local.First()。表2(为简单起见,假设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完成的,我似乎无法找到处理此异常的方法(或者它已经被处理,只是它被报告给Output)。有没有一种安全的方法可以在EntityFramework中使用CanUserAddRows =“True”,其中“:很多”导航属性的类型为ObservableCollection?
我应该指出我还尝试在CollectionViewSource中包装我的Table2ToDisplay属性,但我仍然在输出中看到InvalidOperationException。
提前致谢。
答案 0 :(得分:2)
我将采取疯狂猜测,因为并非所有细节都存在(更新代码,堆栈跟踪等),您正在非ui线程中更改绑定集合。
在这种情况下,您需要:
(在更新逻辑中)
Application.Current.Dispatcher.Invoke((Action)(() =>
{
// update collection here
});
答案 1 :(得分:2)
好。更改Visual Studio的调试器以停止所有异常会让我产生一些问题。例外情况是“AddNew期间不允许使用NewItemPlaceHolder ...”,这是因为我的实体上的PropertyChanged事件而发生的。事实证明这个例外已经被处理了,所以我觉得我很好。