我需要在 DataTemplate 中将我的绑定绑定到潜在的 2 种不同类型的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 属性。
提前致谢, 迈克尔
使用绑定转换器并绑定到元素本身,然后在绑定转换器中遍历可视化树以找到所需的元素.....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.
}
如果您将
Label
和 TextBox
都放入 ContentView
中,那么,您可以将 RelativeSource
设置为 ContentView
,即
您的
Binding.Path
从 AllowDrop
更改为 Content.AllowPath
,其中 Content
将是 Label
或 TextBox
:
AllowDrop={Binding RelativeSource={RelativeSource AncestorType={x:Type ContentView}},
Path=Content.AllowDrop}
如果您担心使用
ContentView
的其他组件出现误报,那么,您可以考虑对 ContentView
进行子类化,比如 LabelTextBoxContentView
那么,您就知道 RelativeSource
永远不会通过查找此特定值来获取误报类型。