0

MS ペイントのカラー セレクタ ダイアログの機能を複製しようとしています。3 つのプロパティを持つダイアログ用の ViewModel があります。

  • パブリック カラー SelectedColor
    • 選んだ色はこれ
    • これを、現在選択されている色を表示する Border 要素の背景にバインドします
  • public double SelectorLeft
    • カスタム カラー領域のセレクターの左側の位置
    • これをセレクターの左の値にバインドします。セレクターは Canvas 内の要素です
    • キャンバスの x 軸は色相です
  • public double Selector上へ
    • カスタム カラー領域のセレクターの上部の位置
    • これをセレクターのトップ値にバインドします。セレクターは Canvas 内の要素です
    • キャンバスの y 軸は彩度です

問題は、それらがすべて相互に関連していることです。定義済みの色領域から色を選択するときは、SelectedColor を更新する必要があります。これにより、SelectorLeft と SelectorTop が更新され、カスタム カラー領域のセレクターが正しい場所に配置されます。また、カスタム カラー エリア内でセレクターを移動すると、SelectedLeft と SelectedTop を更新する必要があり、どちらも SelectedColor を更新する必要があります。これらの関係により、スタック オーバーフローが発生します。

(Ha!、StackOverflow にリストされているスタック オーバーフローの問題)

これを解決するために、あるプロパティの別のプロパティへの依存を取り除く別のアプローチはありますか。それとも、バインドする別のプロパティを定義しますか?

ありがとう、マット

4

3 に答える 3

1

いくつかのアイデア:

  • 新しい値を設定するために、2 つのプロパティ (Left、Top) を読み取り専用にし、すべての入力を 3 番目の形式 (新しい SelectedColor など) に変換します。

  • すべてのプロパティを読み取り専用にし、代わりに SetXXX メソッドを使用して新しい値を設定します (これにより、3 つのプロパティのうち 1 つ以上が変更されます)。副作用を最小限に抑えて、プロパティをできるだけ単純にすることを常にお勧めします。1 つのプロパティを設定しても、クラス内の他のプロパティ値が変更されることはありません。そのため、SetXXX メソッドは副作用を明確にし、プロパティ自体の間の循環参照を排除します。

于 2012-12-12T20:53:41.657 に答える
1

値が現在の値と同じ場合は、プロパティ変更イベントを発生させません。これにより、ループが防止されます。

于 2012-12-13T14:41:36.017 に答える
0

2 つのイベント メソッドを作成します。

UpdateSelectColor - 定義済みを選択したときの MouseClick イベント メソッド

  1. SelectedColor の値を更新する
  2. SelectorLeft の値を更新する
  3. SelectorTop の値を更新する

MoveSelector - セレクターを移動するとき

  1. SelectedColor の値を更新する
  2. SelectorLeft の値を更新する
  3. SelectorTop の値を更新する
于 2012-12-12T20:53:50.860 に答える