2011-10-09 25 views
1

我有一個DataTemplate需要有我的結合將可能2個不同類型的RelativeSource即是這樣的:多的RelativeSource

AllowDrop={Binding RelativeSource={RelativeSource AncestorType={x:Type Label} or AncestorType={x:Type TextBox}}, Path=AllowDrop} 

在這種情況下的RelativeSource將查找樹,並找到第一Label或TextBlock類型的祖先。現在我知道你們都會說什麼了,「爲什麼你要爲這樣的事做一些愚蠢的事?」公平的問題,我很高興你問:-)原因是我正在使用來自syncfusion的WPFish網格。我說WPFish是因爲編寫它的人不清楚WPF應該如何工作,並且需要相當多的竅門才能讓它正常工作。我需要在我的模板中將ContentControl的AllowDrop設置爲與其網格上的AllowDrop屬性相同。通常,這只是一個相當簡單的事情,只需綁定一個RelativeSource類型的網格,但它們有2個網格。一個稱爲GridControl,另一個稱爲GridDataControl。所以我需要搜索樹來查找類型爲GridControl或GridDataControl的第一個控件,並從中獲取AllowDrop屬性。

由於提前, 邁克爾

+0

'TemplateParent'? – SLaks

+0

我認爲TemplateParent在這種情況下不會是網格。這只是ControlTemplates不是嗎? – MikeKulls

回答

1

用的結合轉換器和綁定元素本身,然後步行可視樹中的綁定轉換器,以找到您想要的元素..... uuugggglllyyy!

{Binding Path=., RelativeSource={RelativeSource Self}, Converter={StaticResource findTheCorrectParentConverter}}

,並在你的轉換器部分代碼如下所示:

DependencyObject parent = VisualTreeHelper.GetParent(item); 
while(!(parent is TextBox|| parent is Label)){ 
    parent = VisualTreeHelper.GetParent(parent); 
} 

if (parent != null){ 
    //do some stuff with your stuff. 
} 
+0

謝謝阿蘭,這正是我目前使用的解決方案。你很快就想到了,它花了我很多時間:-)正如你所說這很醜陋,我希望像{Binding RelativeSource = {MultipleRelativeSource Type1 = ....等等。至少新的MarkupExtension是可重用的。 – MikeKulls

+0

你可以創建自己的標記擴展來完成這項工作嗎? (從來沒有這樣做過)我會對看到一個優雅的解決方案感興趣。 –

+0

我確實看過這個。編寫起來相當簡單(只是從MarkupExtension繼承而來)並且重寫ProvideValue被WPF調用,我需要做的就是返回正確的控件。問題是我擁有的只是綁定,所以我無法弄清楚如何從那裏獲得控制權。這可能不是太困難,但那是我被困住了。我可能需要開始一個新的問題,「你如何從綁定對象中找到目標」:-) – MikeKulls