3

一部のデータを保持するために使用している Microsoft Sql CE でテーブルを作成しました。SqlMetal を介して ORM を生成し、データソースを WPF プロジェクトに取り込みました。

ORM で生成されたクラスを介してテーブル内のレコードを編集するために使用できる単純な WPF フォームを作成したいと考えています。このフォームで、典型的な OK/Cancel セマンティクスをサポートしたいと考えています。ORM からのオブジェクトのインスタンスに対してバインドするために、それぞれのフィールドで TwoWay データバインディングを使用して、典型的な方法であると思われる方法でフォームを作成しました。たとえば、プロパティ「TaskName」を持つ ORM 内のオブジェクトが与えられた場合、WPF フォームに以下を含めました。

<Label Grid.Column="0" Grid.Row="0" >
    Name:
</Label>
<TextBox Name="txtName" Grid.Column="1" Grid.Row="0" 
         Text="{Binding TaskName, Mode=TwoWay}" AcceptsReturn="False"
         MaxLines="1" />

これを、コード内の DataContext 割り当てと組み合わせます。

var newRow = new OrmGeneratedClass();
// Populate default values on newRow, e.g.    
detailWindow.DataContext = newRow;
detailWindow.ShowDialog();

新しい行の作成にはかなりうまく機能します。フォームを介して行われたすべての変更は、基になる OrmGeneratedClass にすぐに反映されます。問題は、たとえば OrmGeneratedClass が以前に保存された値で満たされている場合、変更をキャンセルするための即時サポートがないことです。

このシナリオに適した設計は何ですか? または、この時点に到達する前に間違った設計をしているのでしょうか? 私は WPF と Sql Server データソース/ORM 統合の面で初心者です。(これは、両方のテクノロジを学習するために使用している個人的なプロジェクトです。)

いくつかの考えがあり、それらを回答に入れます

4

2 に答える 2

7

Paul Stovell は、IEditableObject インターフェイス用のアダプタの作成に関するすばらしい記事を書いています。このアダプタを使用すると、データバインドを行ったり、適用/復帰動作を許可したりできます。

http://www.paulstovell.com/blog/runtime-ui-binding-behavior-ieditableobject-adapter

アダプターは ORM オブジェクトをラップし、変更を自動的にキャッシュするので、変更を適用するか元に戻すことができます。

于 2008-12-07T04:35:18.650 に答える
1

考えられる解決策の 1 つは、ダイアログからキャンセルの結果を探し、ORM オブジェクトの主キーを使用して、ユーザーがキャンセルするたびにデータベースからデータを取得して、オブジェクトがデータベースに持っていた値が含まれていることを確認することです。これは、値の最新の確認値がすでにデータベースに格納されていることを前提としています。(おそらく、これほど単純なプログラムでは公正な仮定です。)

次の (コンパイルされていない) コードのようになります。

var existingRow = GetExistingRow(someConditionOrWhatever);
detailWindow.DataContext = existingRow;
if(!detailWindow.ShowDialog())
{
    existingRow = GetExistingRow(someConditionOrWhatever);
}

ただし、そのようなデータベースへの往復が好きかどうかはわかりません。

于 2008-12-07T04:32:35.880 に答える