当孩子更改属性值时通知父级

问题描述:

我正在写一个简单的日历控件,以便更好地理解WPF。我有一个包含两个按钮(下,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改变通知CalendarMonth,我加入业主依赖属性把它作为

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

当CalendarHeader改变CurrentMonth的价值,我认为这也将引发CalendarMonth的CurrentMonthChangedCallBack但它不是这样做。如何通知CalendarMonth CalendarHeader中CurrentMonth的值已更改。 感谢百万

一种选择是创建一个基本控件(我们称之为CalendarPrimitive)来存储CurrentMonthProperty。当您使用FrameworkPropertyMetadataOptions.Inherit注册属性注册时。

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

如果您的*Calendar控件也是从CalendarPrimitive派生的,它将负责存储CurrentMonthProperty,并且它的所有子项都将继承该值。

此外,您可能需要定义CalendarPrimitive可用于通知它已更改CurrentMonth的*的CurrentMonthChanged RoutedEvent。

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

+0

Mike, 我不确定这是否会奏效。首先,CalendarHeader嵌套在CalendarMonth内。其次,它是CalendarHeader,它具有更改月份的按钮。因此从基类继承不会做太多的事情,因为它不是改变值的基类,而是CalendarHeader。 – Sheraz 2009-09-03 20:46:41

+0

依赖属性继承导致在父项上设置的值应用于其所有子项(这就是为什么在窗口上设置背景会使所有子项都变为背景的原因)。 通过使用路由事件,会通知家长有人想要更改当前月份。当家长这样做时,所有的孩子都会得到更新。 – 2009-09-04 12:45:50

+0

这是我所做的解决了这个问题。我按照你的定义添加了一个基类。由于CalendarHeader嵌套在CalendarMonth中,因此我不会使用具有继承性的DependencyProperty。相反,我在基类中定义了一个路由事件。在标题中提出该事件。在CalendarMonth中注册一个处理程序。将发件人转换为CalendarHeader以获取Current Month的值并设置e.Handled = true。这让它工作。 谢谢 – Sheraz 2009-09-06 19:33:47