多个相对源

问题描述 投票:0回答:2

我需要在 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 属性。

提前致谢, 迈克尔

c# .net wpf c#-4.0
2个回答
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
投票

如果您将

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
永远不会通过查找此特定值来获取误报类型。

© www.soinside.com 2019 - 2024. All rights reserved.