1

모든 발생했습니다. DB (및 데이터 모델)에는 Table2와 1 : 많은 관계가있는 Table1이 있습니다.첫째 예외는</p> <p>내가 데이터베이스 첫 번째 엔티티 프레임 워크 V4.4을 사용하고, PresentationFramework.dll

WPF의 DataGrid를 Table1.Local.First()에 바인딩합니다. Table2 (간단히하기 위해 Table1.Local에 엔티티가있는 것으로 가정).

는 뷰 모델 : 텍스트 상자로 일어나는 NewItemPlaceHolder 내부를 클릭하면 XAML에서

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>. 

, 나는

<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> 

다음, 나는이 PresentationFramework에서 System.InvalidOperationException에 발생하는 얻을. dll. 이것은 내 응용 프로그램을 손상시키지 않지만 출력에서 ​​볼 수 있습니다. 내 생각 엔 엔티티가 다른 스레드에 추가되므로 CollectionChanged 이벤트가 다른 스레드에서 발생하므로 InvalidOperationException이 발생합니다. 그러나 코드는 주로 XML을 통해 수행되므로이 ​​예외를 처리 할 방법을 찾지 못하고 있습니다 (또는 이미 처리 중이므로 출력으로보고되는 것입니다). EntityFramework에서 CanUserAddRows = "True"를 사용하는 안전한 방법이 있습니까? ": 많은"탐색 속성은 ObservableCollection 유형입니까?

필자는 TableViewToDisplay 속성을 CollectionViewSource 내에 배치하려고 시도했지만 여전히 출력에 InvalidOperationException이 표시된다는 것을 지적해야합니다.

미리 감사드립니다.

답변

2

자 (업데이트 로직). Visual Studio의 디버거를 모든 예외에서 중지하도록 변경하면 몇 가지 단서가 생깁니다. 예외는 "NewItemPlaceHolder가 AddNew ... 중에 허용되지 않습니다"입니다. 이는 내 Entity의 PropertyChanged 이벤트로 인해 발생합니다. 이 예외가 이미 처리되었으므로 나는 훌륭하다고 생각합니다.

2

비 UI 스레드에서 바운드 컬렉션을 변경하는 모든 세부 정보 (업데이트 코드, 스택 추적 등)가있는 것이 아니기 때문에 나는 야생 추측을 할 것입니다.

는 경우에, 당신이 필요합니다

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