当孩子改变财产价值时通知父母

时间:2009-09-03 19:41:50

标签: wpf

我正在编写一个简单的日历控件,以便更好地理解WPF。我有一个CalendarHeader控件,包含两个按钮(下一个,prevoious)和一个依赖属性CurrentMonth定义为

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

需要与CalenderHeader进行交互的另一个控件是CalendarMonth。要在CalendarHeader中更改月份时通知CalendarMonth,我将向其添加所有者依赖项属性

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

当CalendarHeader更改CurrentMonth的值时,我认为它还会触发CalendarMonth中的CurrentMonthChangedCallBack,但它没有这样做。如何通知CalendarMonth CalendarHeader中CurrentMonth的值已更改。 万分感谢

1 个答案:

答案 0 :(得分:1)

一个选项是创建一个基本控件(让我们称之为CalendarPrimitive)来存储CurrentMonthProperty。使用FrameworkPropertyMetadataOptions.Inherit。

注册属性寄存器时

如果从CalendarPrimitive派生CalendarHeaderControl和CalendarMonth控件,该值将自动从CalendarHeader向下传递给CalendarMonth(假设CalendarMonth嵌套在CalendarHeader中)。

如果你的顶级Calendar控件也派生自CalendarPrimitive,它会更好,它将负责存储CurrentMonthProperty,它的所有子节点都会继承该值。

此外,您可能希望定义一个CurrentMonthChanged RoutedEvent,CalendarPrimitive可以使用它来通知它已更改CurrentMonth的顶级。

您的顶级日历会侦听此事件并相应地更改其CurrentMonth(将更改传播到树中)。