-1

私の問題を説明する前に: これSliderは、次の問題の単なる例です。私はスライダーがここで行うのと非常によく似たことをしなければならないカスタムコントロールに取り組んでいます:

シナリオ:

  • Slider.ValueというViewModel プロパティにをバインドしましたMyValue
  • の を と定義しましMaximumた。Slider100
  • 次に、プロパティMyValueをに設定し200ます。

何が問題ですか?

  • Slider は内部的に値を強制的に 100 にします。
  • しかし、プロパティMyPropertyは更新されていません。
  • 私の場合 (私が作成したカスタム コントロール)、後で古い (200) 値ではなく、強制された値 (100) を続行する必要があります。

質問:

カスタム コントロールでできることはありますか?

たとえば、私は と の両方で試しましmyControl.GetExpression(MyValueProperty).UpdateSource();たが、何を試しても、バインドされた ViewModel プロパティのセッターは決して呼び出されず、プロパティは同期されません。CoerseValueCallbackPropertyChangedCallback

4

1 に答える 1

1

Maximumのプロパティを別のビュー モデル プロパティにバインドし、Sliderロジックを実装して、値が常にビュー モデル クラスの有効な範囲内にあるようにします。

コントロールは値を正しく強制しますが、値を同期するロジックはビュー モデル クラスに実装する必要があります。

DataContextただし、カスタム コントロールは、値が強制されるたびに、現在のソース プロパティを簡単に設定できる必要があります。

this.GetBindingExpression(Slider.ValueProperty).ResolvedSourcePropertyNameソース プロパティの名前を指定する必要があります。たとえば、呼び出しが機能しない場合は、リフレクションを使用して設定できUpdateSource()ますBindingExpression

于 2022-01-20T20:31:15.113 に答える