5

したがって、顧客レコードを含む顧客テーブルがあり、各レコードには顧客タイプ フィールドがあります。また、customertype フィールドの有効な値を含む customertype テーブルもあります。

また、CRUD を実行するには WPF が必要です。(作成、レビュー、更新、削除)。

明らかな解決策は、SelectedValue プロパティを customertype フィールドにバインドし、ItemsSource プロパティを customertype テーブルのクエリによって取り込まれたリストにバインドして、ComboBox を使用することです。

問題は、演習で見られるような単純な問題以外ではうまくいかないことです。

customertype テーブルにない customertype 値を持つ顧客レコードを表示または編集しているときに問題が発生します。これは、エラーによって発生するか、customertype が廃止され、テーブルから削除されたために発生する可能性があります。

SelectedValue が ItemsSource リストにないため、この状況で WPF が行うことは、customertype フィールドを null に設定することです。そして、それは問題です。

表示のみの場合は、リストにあるかどうかに関係なく、テーブルにある値が表示されます。編集している場合は、少なくとも最初はテーブルにある値も表示する必要があるという合理的な議論を行うことができますが、選択を変更すると、元の値を取得できなくなります。

それで、何かアイデアはありますか?これは、私が持っているほぼすべての編集/表示フォームで発生する問題なので、使用時に合理的にクリーンなものを好むでしょう。(つまり、XAML の複雑さ、これらのフィールドの 1 つを処理する必要があるすべての場所、またはこれらのフィールドの 1 つを処理するために挿入する XAML をサポートするコードの複雑さの選択を考えると、私は後者を好みます。)

4

2 に答える 2

3

このため、ItemsSource を CustomerType テーブルのコンテンツに直接バインドしないことをお勧めします。代わりに、Customer Type テーブルの Customer Type 項目の ItemsSource と、Customer Type テーブルに存在しない Customer レコードに保存されているすべての CustomerType 値をマージします。ユーザーが表示から編集に移行したら、コレクションを更新して、CustomerType テーブル内のアイテムのみを使用します。ユーザーが表示モードに入ると、マージされたコレクションに戻ります。

于 2012-05-18T20:27:07.483 に答える
0

上記の答えは役立ちますが、各インスタンスでかなりの量のコードが必要になります。そして、この問題は、リストがある場所から来て、選択された値が別の場所から来る一般的なパターンとして存在します。

私はまだ解決策を決めていませんが、私の最新の試みは有望です.

私が行ったことは、ComboBox から新しいクラスを派生させることです。それに、新しい DependencyProperty - AddSelectedIfMissing を追加しました。そして、OnItemsChanged() をオーバーライドします。その中で、SelectedValue が ItemsSource 内のいずれかの項目の SelectedValuePath フィールドと一致するかどうかを確認します。

有効な選択肢を表すレコード オブジェクトのコレクションを返すビューモデルのプロパティに ItemsSource をバインドしています。SelectedValue を、既存の値を含むビューモデルのプロパティにバインドしています。そして、SelectedValue を ItemsSource に追加するときに true であるビューモデルのブール値プロパティに AddSelectedIfMissing をバインドしています。

ビューから編集に変更すると、ItemsSource にバインドされたプロパティで PropertyChanged が発生するため、コントロールはそれをリロードします。

私が今持っているものにはいくつかの制限があります。オブジェクトから IList に ItemsSource をキャストできること、およびオブジェクトからフィールド値を取得できる既知の基本クラスに各項目をキャストできることに依存します。また、SelectedValue の代わりに SelectedItem をバインドすると機能しません。

しかし、それらの制限内では、うまく機能しています。

于 2012-05-24T18:40:43.020 に答える