多个RelativeSource

时间:2011-10-09 23:41:12

标签: c# .net wpf c#-4.0

我需要在DataTemplate中让我的绑定可能有两种不同类型的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属性。

提前致谢, 迈克尔

1 个答案:

答案 0 :(得分: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.
}