2

全て、

私はDataBase First Entity Framework v4.4を使用しています。DB (およびデータ モデル) には、Table2 と 1 対多の関係を持つ Table1 があります。

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 経由で行われるため、この例外を処理する方法を見つけることができないようです (または、既に処理されているか、単に Output に報告されているだけです)。":Many" ナビゲーション プロパティが ObservableCollection 型である EntityFramework で CanUserAddRows="True" を使用する安全な方法はありますか?

CollectionViewSource 内に Table2ToDisplay プロパティをラップしようとしたことも指摘しておく必要がありますが、それでも出力に InvalidOperationException が表示されます。

前もって感謝します。

4

2 に答える 2

2

わかった。Visual Studio のデバッガーをすべての例外で停止するように変更すると、いくつかのインサイトにつながります。例外は、「AddNew 中は NewItemPlaceHolder は許可されていません...」でした。これは、エンティティの PropertyChanged イベントが原因で発生しました。この例外は既に処理されていることが判明したので、問題ないと思います。

于 2013-03-14T16:48:08.710 に答える
2

非 UI スレッドでバインドされたコレクションを変更しているすべての詳細 (更新コード、スタック トレースなど) が存在するわけではないので、私は大げさな推測をします。

その場合、次のものが必要です。

(更新ロジック内)

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