2011-01-24 5 views
0

LinqToSqlをデータソースとして使用しています。テーブルからプログラマのリストをクエリし、そのデータをループしてObservableCollectionに移入するとしましょう。 (最初の質問は、間違ってこの部分である?ちょうど別のリストを移入することをループし、リストにデータを照会するために奇妙なようだと)WPFでDatabindingとObservableCollectionsのベストプラクティスは何ですか?

次に、私はリストボックスにプログラマーの私のObservableCollectionをデータバインドするとき。次に、ListBoxのselectedItemをTextBoxにバインドします。 ListBoxでアイテムを選択するとテキストボックスが更新され、テキストボックスで変更を加えるとListBoxが更新され、結果としてリストボックスがバインドされているObservableCollectionも更新されることを理解しています。

私が完全に理解していないのは、OCのデータをオリジナルのデータソースに戻すことです。各レコードを更新して、変更をコミットする観測可能なコレクションをループするだけですか?それはひどく効率的ではないようです。

ご協力いただきありがとうございます。 -Josh

答えて

1

これはまったくビューモデルの問題です。フェンスのデータ側のすべてのオブジェクトとプロパティを完全に制御できます。ユーザーが単一のレコードのみを編集でき、すべての作業をデータバインディングで行い、ユーザーが保存をクリックしたときにデータベースに書き戻すというシンプルな方法があります。

多くのデータが表示されていて、そのうちの1つをユーザーが変更できる場合は、オブジェクト自体にダーティーフラグを保持して、プロパティのいずれかがあるかどうかを記録することをお勧めします変更されました。こうすることで、変更されたエントリだけを効率的に元に戻すことができます。

オブジェクトがおそらくINotifyPropertyChangedをサポートしていて、あなたのコレクションが観測可能なので、ダーティーフラグを自動的に検出して管理することもできます。それとも、すべての設定者に汚れを真に設定する方が簡単かもしれません。

いずれにしても、この情報はユーザーにとっても役立ちます。たとえば、ユーザーインターフェイスでは、保存されていないレコードを太字またはその他の規則で表示することができます。

0

ObservableCollectionは、wpfで使用できる唯一のコレクションではありません。しかし、標準コレクションでは、wpfはアイテムの追加や削除などのコレクションの変更時にListBoxなどのuiアイテムコンテナを自動的に更新できます。リストではできません。

ユーザーがListBoxItem内のテキストボックスを変更すると、ObservableCollectionが更新されません。これは、コレクションのアイテムを追加または削除したり並べ替えたりしないためです。いずれかの項目のプロパティを変更します。

ListBoxには、ItemsSourceとして指定されたコレクション内の各アイテムのListBoxItemコンテナのリストが含まれています。 各ListBoxItemのDataContextは、ObservableCollectionに格納されている対応する項目に設定されています。したがって、コード内でTextBoxのテキストを変更すると、バインディングエンジンはTextBox.Textに指定されたその項目のプロパティをバインディングで変更します。 ObservableCollectionオブジェクトの変更や更新はありません。

このようなアイテムのプロパティの設定者では、通常、INotifyPropertyChangedインターフェイスのPropertiesChangedイベントが発生します。これは通常、汚れた旗を立てる場所です。そして、あなたはまた、そこからすぐに変更をコミット済オブジェクトのいくつかのリストを維持するかのようなコミットでそれらを検索できます。

items.Where(item => item.IsDirty) 

はまた、スヌープとWPFInspectorのような良いツールが大幅にあなたは、WPFアプリを理解するのに役立ちれ、そこにあります各要素のビジュアルツリーとデータコンテキストテキスト

関連する問題