1

WPF アプリケーションの Linq と ObservableCollections に問題があります。

問題のコンテキスト:

User と BankAccounts の 2 つのテーブルを持つ非常に単純な SQL データベースを作成しました。User テーブルは、BankAccounts テーブルと 1 対多の関係にあります。次に、Linq-to-SQL データクラスを作成しました。これは正常に機能しました ==> 2 つのテーブル間の関連付けも検出されました。

次に、正常に動作するすべてのユーザーを取得する関数を作成しました。

DataClassesDataContext dc = new DataClassesDataContext

var query = from u in dc.Users
            select u;

ここで、各ユーザーに新しい BankAccount を追加したいとします (可能性は低いですが、それでもなお)。次のコードを追加できます

for each(User u in query)
{
   u.BankAccounts.Add(New BankAccount());
}

上記はすべて正常に動作します。BankAccounts プロパティは、データベースと Linq DataClasses の関連付けにより、自動的に User クラスの一部になります。

ただし、私のアプリケーションでは、最初にクエリ結果を ObservableCollection に追加します。これにより、あらゆる種類のデータバインディングと変更通知を使用できます。これは、次のコードによって実現されます。

ObservableCollection<User> oUsers = new ObservableCollection<User>(query);

問題: ObservableCollection 内では、ユーザーの BankAccounts プロパティを操作できません。タイプが EntitySet<> になっているためです。そのため、次のステートメントはもう実行できません。

for each(User u in oUsers)
{
   u.BankAccounts.Add(New BankAccount());
}

どういうわけか、クエリ結果が観察可能なコレクションに追加されると、 user.BankAccounts プロパティにアクセスできなくなります。ただし、BankAccounts プロパティをリストボックスなどの任意のコントロールにバインドすることは可能であり、正しいデータが含まれています。

これらの「関連付けられた」プロパティにアクセスできるobservableColllction(または同様のコレクション)を作成する方法はありますか?解決が本当に待ち遠しいです。

前もって感謝します!よろしくお願いします、

Bas Zweeris E: Bas.Zweeris@Capgemini.com

4

1 に答える 1

2

IQueryable を実装する元のものを追跡し、queryそれに対して必要な追加のクエリを実行できます。

ObservableCollection は、WPF が何かをバインドするためのものである必要があります。新しいコレクション項目を追加したいが、ユーザーが編集する前にデータベースにプッシュしたくない場合に非常に便利です。

例えば。

// Create a new blank client type
var ct = new ClientType()
{
    IsArchived = false,
    Description = "<new client type>",
    Code = "CT000",
    CanLoginOnline = true
};

// Tell the data source to keep track of this object
db.ClientTypes.InsertOnSubmit(ct);

// Also add the object to the observable collection so that it can immediately be shown in the UI and editted without hitting the db
clienttypes.Add(ct);
于 2009-12-09T19:53:50.893 に答える