1

我有一个普通的 WPF 窗口,我们称它为TopLevel其中有一堆控件,除其他外,ListView它应该在应用程序的不同元素中记录某些事件。

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

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

我怎么做?我猜我想为它使用路由事件,但我不知道如何让复选框单击“查找”Order以将其向上发送到TopLevel.

4

1 回答 1

1

像这样的东西怎么样...

private void CheckBox_Checked(object sender, RoutedEventArgs e)
    {
        CheckBox checkBox = sender as CheckBox;
        Task task = FindParentTask(checkBox);
        Order order = task.Order;
    }

由于您需要遍历可视化树才能到达任务,因此您可以尝试一些递归......

public FrameworkElement FindParentTask(FrameworkElement element)
    {
        if (element.Parent.GetType() == typeof(Task))
            return element.Parent as FrameworkElement;
        else
            return FindParentTask(element.Parent as FrameworkElement);
    }

我刚刚测试了这种方法来检索我的一个 UserControls 上的 CheckBox 的父 Expander,它在可视树的几个层次上,嵌套在 StackPanels、Grids 和 DockPanels 的堆中,工作得很好。

于 2010-01-22T10:23:43.450 回答