2009-09-03 10 views
0

私はWPFをよりよく理解するための簡単なカレンダーコントロールを作成しています。私は2つのボタン(次、prevoious)が含まれていCalendarHeader制御と子がプロパティ値を変更したときに親に通知する

public static DependencyProperty CurrentMonthProperty = DependencyProperty.Register 
     ("CurrentMonth", typeof(int), typeof(CalendarHeader), new FrameworkPropertyMetadata(DateTime.Now.Month, FrameworkPropertyMetadataOptions.None, CurrentMonthChangedCallBack)); 

としてCalenderHeaderがCalendarMonthあると対話するので、必要な別の制御を定義した依存関係プロパティのCurrentMonthを持っています。 CalendarHeaderがCurrentMonthの値を変更した場合、月がCalendarHeaderに変更されたときCalendarMonthを知らせるために、私は

public static DependencyProperty CurrentMonthProperty = CalendarHeader.CurrentMonthProperty.AddOwner 
     (typeof(CalendarMonth), new FrameworkPropertyMetadata(DateTime.Now.Month, CurrentMonthChangedCallBack)); 

としてそれに所有者の依存関係プロパティを追加している、私はそれがまたCalendarMonthでCurrentMonthChangedCallBackを誘発するだろうと思ったが、そうではありませんそれをやって。 CalendarHeaderのCurrentMonthの値が変更されたことを、どのようにしてCalendarMonthに通知できますか? ありがとうございます

答えて

1

1つのオプションは、CurrentMonthPropertyを格納するための基本コントロール(CalendarPrimitiveと呼ぶ)を作成することです。プロパティー・レジスターをFrameworkPropertyMetadataOptions.Inheritに登録するとき。

CalendarHeaderControlとCalendarMonthコントロールをCalendarPrimitiveから派生させた場合、その値は自動的にCalendarHeaderからCalendarMonth(CalendarMonthがCalendarHeader内にネストされていることを前提とします)にツリーを渡します。

トップレベルのカレンダーコントロールがCalendarPrimitiveから派生している場合でも、それはCurrentMonthPropertyの格納を担当し、すべての子がその値を継承します。

さらに、CurrentMonthChanged RoutedEventを定義して、CalendarPrimitiveがCurrentMonthを変更したトップレベルに通知することもできます。

あなたの最上位のカレンダーは、このイベントをリッスンし、それに応じてCurrentMonthを変更します(ツリーの変更を反映します)。

+0

Mike、 それがうまくいくかどうかわかりません。まず、CalendarHeaderはCalendarMonth内にネストされます。 第2に、月を変更するボタンを持つCalendarHeaderです。ベースクラスから継承することは、値を変更している基本クラスではなく、CalendarHeaderであるため、多くのことを行いません。 – Sheraz

+0

依存関係プロパティ継承により、親に設定された値がすべての子に適用されます(これがウィンドウの背景を設定すると、すべての子に対して背景が変更されます)。 ルーテッドイベントを使用すると、誰かが現在の月を変更したがっていることが親に通知されます。親がそうすると、すべての子どもが更新されます。 –

+0

これは私が問題を解決したことです。あなたが定義したベースクラスを追加しました。 CalendarHeaderはCalendarMonthにネストされているので、継承でDependencyPropertyを使用することはできません。代わりに、私は基底クラスでRouted Eventを定義しました。ヘッダーでそのイベントを発生させました。 CalendarMonthのハンドラを登録しました。現在の月の値を取得し、e.Handled = trueに設定するには、送信者をCalendarHeaderにキャストしました。それはそれを働かせました。 ありがとう – Sheraz

関連する問題