2010-01-22 52 views
1

我有一個正常的WPF窗口,我們稱之爲TopLevel其中有一堆控件,其中包括簡單的ListView應該在應用程序的不同元素中記錄某些事件。WPF:自定義路由事件與額外的信息

因此,假設我有一個GridTopLevel其中包含一堆名爲Task的用戶控件。每個Task都有一個與它們關聯的對象作爲公共屬性,我們稱它爲Order,以及一個標準複選框。

現在我想TopLevel器,以便在用戶檢查在Task複選框的事件,但事件應包含Order對象爲好,這樣我就可以用它從TopLevel工作,把它放入事件日誌。

我該怎麼做?我猜我想使用路由事件,但我不知道如何獲得複選框點擊「查找」Order向上發送到TopLevel

+0

你有工作嗎? – TabbyCool 2010-01-25 16:25:57

+0

@TabbyCool:在決定是否使用您的方法之前,我決定尋找其他選項。無論如何,我會給你「正確的答案」。 – 2010-01-26 09:54:51

+0

謝謝,哈哈!你有沒有發現有前途的東西如果您決定採用另一種解決方案,我會對如何實現這一點感興趣:-) – TabbyCool 2010-01-26 10:05:59

回答

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的父級擴展器,它在可視樹上的幾個級別嵌套在一堆StackPanels,Grids和DockPanels中,工作得很好。

+0

因此,我可以將一個'DependencyObject'轉換爲我想要的任何類型? – 2010-01-22 10:27:15

+0

你是指checkBox.Parent?如果底層對象已經是Task類型,那麼是的,我認爲是。你有你的代碼樣本嗎?不過不能傷害嘗試它,它只是幾行 :-) – TabbyCool 2010-01-22 10:32:51

+0

此外,複選框不是「任務」的直接子節點,所以我需要以某種方式向上遍歷「Task」 。 – 2010-01-22 10:33:02