我有一个普通的WPF窗口,我们称之为TopLevel
,其中有一堆控件,其中包括一个简单的ListView
,它应该在应用程序的不同元素中记录某些事件。 / p>
假设Grid
中有一个TopLevel
,其中包含一组名为Task
的用户控件。每个Task
都有一个与之关联的对象作为公共属性,我们称之为Order
,以及标准复选框。
现在,每当用户选中TopLevel
中的复选框时,我都希望Task
收到一个事件,但该事件也应包含Order
对象,因此我可以使用它从TopLevel
将其放入事件日志。
我该怎么做?我猜我想要使用路由事件,但我无法弄清楚如何让复选框点击“查找”Order
将其向上发送到TopLevel
。
答案 0 :(得分:1)
这样的事情怎么样......
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
CheckBox checkBox = sender as CheckBox;
Task task = FindParentTask(checkBox);
Order order = task.Order;
}
由于您需要遍历可视树以进入Task,您可以尝试一些递归...
public FrameworkElement FindParentTask(FrameworkElement element)
{
if (element.Parent.GetType() == typeof(Task))
return element.Parent as FrameworkElement;
else
return FindParentTask(element.Parent as FrameworkElement);
}
我刚刚测试了这个方法来检索我的一个UserControl上的CheckBox的父Expander,它是可视化树的几个层次,嵌套在StackPanels,Grids和DockPanels堆中,工作得很好。