2

全部,

我正在使用数据库优先实体框架 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。

提前致谢。

4

2 回答 2

2

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

在这种情况下,您需要:

(在更新逻辑中)

Application.Current.Dispatcher.Invoke((Action)(() =>
    {
       // update collection here
    });
于 2013-03-14T16:47:36.380 回答
2

好的。更改 Visual Studio 的调试器以停止所有异常导致我进入一些现场。例外是“在 AddNew... 期间不允许使用 NewItemPlaceHolder”,这是由于我的实体上的 PropertyChanged 事件而发生的。原来这个异常已经被处理了,所以我觉得我很好。

于 2013-03-14T16:48:08.710 回答