PresentationFramework.dll中出现“System.InvalidOperationException”类型的第一次机会异常

时间:2013-03-14 16:14:44

标签: wpf entity-framework exception invalidoperationexception

所有

我正在使用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。

提前致谢。

2 个答案:

答案 0 :(得分:2)

我将采取疯狂猜测,因为并非所有细节都存在(更新代码,堆栈跟踪等),您正在非ui线程中更改绑定集合。

在这种情况下,您需要:

(在更新逻辑中)

Application.Current.Dispatcher.Invoke((Action)(() =>
    {
       // update collection here
    });

答案 1 :(得分:2)

好。更改Visual Studio的调试器以停止所有异常会让我产生一些问题。例外情况是“AddNew期间不允许使用NewItemPlaceHolder ...”,这是因为我的实体上的PropertyChanged事件而发生的。事实证明这个例外已经被处理了,所以我觉得我很好。