WPF:具有额外信息的自定义路由事件

时间:2010-01-22 09:52:29

标签: c# wpf routed-events

我有一个普通的WPF窗口,我们称之为TopLevel,其中有一堆控件,其中包括一个简单的ListView,它应该在应用程序的不同元素中记录某些事件。 / p>

假设Grid中有一个TopLevel,其中包含一组名为Task的用户控件。每个Task都有一个与之关联的对象作为公共属性,我们称之为Order,以及标准复选框。

现在,每当用户选中TopLevel中的复选框时,我都希望Task收到一个事件,但该事件也应包含Order对象,因此我可以使用它从TopLevel将其放入事件日志。

我该怎么做?我猜我想要使用路由事件,但我无法弄清楚如何让复选框点击“查找”Order将其向上发送到TopLevel

1 个答案:

答案 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堆中,工作得很好。