私はPropertyChangedCallbackを持つ依存プロパティを持つカスタムコントロールを持っています。プロパティの値は、カスタムコントロールのロジック内から変更することも、ユーザーの操作やクライアントアプリケーションからの値の設定によって変更することもできます。PropertyChangeCallback - コントロール内からの変更かどうか
プロパティの変化の原因は何ですか?
"送信者"を見てみましたが、いずれの場合も送信者はカスタムコントロールです。
public static readonly DependencyProperty SelectedTimeProperty =
DependencyProperty.Register("SelectedTime", typeof(DateTime?), typeof(TimePickerControl), new PropertyMetadata(null, new PropertyChangedCallback(HandleSelectedTimeChanged)));
public static readonly DependencyProperty HoursProperty =
DependencyProperty.Register("Hours", typeof(object), typeof(TimePickerControl), new PropertyMetadata(@"", (o, e) => ((TimePickerControl)o).OnHoursChanged(o, e.OldValue)));
public static readonly DependencyProperty MinutesProperty =
DependencyProperty.Register("Minutes", typeof(object), typeof(TimePickerControl), new PropertyMetadata(@"", (o, e) => ((TimePickerControl)o).OnMinutesChanged(o, e.OldValue)));
public static readonly DependencyProperty SecondsProperty =
DependencyProperty.Register("Seconds", typeof(object), typeof(TimePickerControl), new PropertyMetadata(@"", (o, e) => ((TimePickerControl)o).OnSecondsChanged(o, e.OldValue)));
をので、クライアントアプリケーションはHours
、Minutes
とSeconds
を制御することによって更新されるであろう場合にはSelectedTime
を更新でき、次のいずれか説明するために
。このロジックはHandleSelectedTimeChanged
で処理されます。
しかし、ユーザーはSelectedTime
はそれに応じて更新する必要がありますするHours
の1、Minutes
とSeconds
を変更することができます。
あなたはおそらく推測できるように、これはHours
はもちろん彼らのコールバックを呼び出す営業時間/ミンス/秒数を変更するトリガするSelectedTime
コールバックを引き起こす、たとえば、変動するので、ループのビットを作成し、再びトリガーされる。
変更がコントロール外から発生した場合のみコールバックを呼び出すか、コールバック内でこれを検出してすぐに終了します。
私がこれまで思いついた唯一のアイデアは、プロパティの1つを変更する前にプライベート変数を設定することです。設定されている場合はコールバック出口で変更した後、それを即座にクリアしますが、私に。これを行うより良い方法はありますか?
依存プロパティはコントロール内にあります。コントロール内から値を変更している場合は、単にフラグを使用してください:変更前に設定し、コールバックでチェックしてください。もう一つは[強制](https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/dependency-property-callbacks-and-validation#coerce-value-callbacks-and-property-changed)です。 -events)。 – Sinatr
_ "おそらく推測できるように、これは少しのループを作ります" _これは起こらないはずです。プロパティの値が実際に変更されたときにのみ、コールバックが呼び出されます。したがって、 'Hours'プロパティを変更した場合、そのコールバックは' SelectedTime'プロパティを設定し、 'Hours'プロパティ値を再び設定します。しかし、 'Hours'プロパティ値は変更されていないので、そのプロパティ変更コールバックは呼び出されません。あなたの問題は、あなたの 'Hours'、' Minutes'と 'Seconds'の依存関係のプロパティが**オブジェクト**として宣言されていることと関連があると思われます。彼らは** int **でしょうか? –
@StevenRands - 無限ループではなく、あなたが言っていることを理解していますが、読み込み/デバッグ/保守が難しく、コントロール内に他の問題を引き起こす可能性がある複雑なスパゲッティフローが作成されています。 – colmde