C# 多重相对资源

C# 多重相对资源,c#,.net,wpf,c#-4.0,C#,.net,Wpf,C# 4.0,我需要在DataTemplate中绑定到两种不同类型的相对资源,例如: AllowDrop={Binding RelativeSource={RelativeSource AncestorType={x:Type Label} or AncestorType={x:Type TextBox}}, Path=AllowDrop} 在这种情况下,relativeSource将查找树并找到类型Label或TextBlock的第一个祖先。现在我知道你们要说什么了,“你们为什么要做这样愚蠢的事?”,公平

我需要在DataTemplate中绑定到两种不同类型的相对资源,例如:

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属性相同。通常情况下,这将是一个相当简单的问题,只需绑定其网格的相对资源类型,但它们有2个网格。一个称为GridControl,另一个称为GridDataControl。因此,我需要搜索树以找到GridControl或GridDataControl类型的第一个控件,并从中获取AllowDrop属性

提前感谢,,
Michael

使用绑定转换器并绑定到元素本身,然后遍历绑定转换器中的可视树以找到所需的元素…uuugggglllyyyy

{Binding Path=,RelativeSource={RelativeSource Self},Converter={StaticResource find thecorrectparentconverter}
}

转换器中的一些代码如下:

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.
}

使用绑定转换器并绑定到元素本身,然后遍历绑定转换器中的可视树以找到所需的元素…..uuugggglllyyyy

{Binding Path=,RelativeSource={RelativeSource Self},Converter={StaticResource find thecorrectparentconverter}
}

转换器中的一些代码如下:

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.
}

谢谢Aran,这正是我目前使用的解决方案。你很快就想到了,花了我很长时间:-)正如你说的,它很难看,我希望得到像{Binding RelativeSource={MultipleRelativeSource Type1=..之类的东西。至少新的标记扩展是可重用的。你能创建你自己的标记扩展来完成这项工作吗?(我自己从来没有这样做过)我很想看到一个优雅的解决方案。我确实对此进行了研究。编写起来相当简单(只是从MarkupExtension继承)WPF调用了override ProviderValue,我所需要做的就是返回正确的控件。问题是我所拥有的只是绑定,所以我无法确定如何从那里获取控件。这可能不太难,但如果我被卡住了。我可能需要开始一个新的问题,“如何从绑定对象中找到目标":-)如果需要,请提供链接。Cheers我尝试创建一个标记扩展来完全替换绑定,对此进行了研究。对于使用textbox/combobox作为两个父项的示例来说,这很好。调用了ProvideValue,我可以很容易地到达目标。我以为我已经解决了它。但是当我使用在网格中,我得到了一个名为SharedDp的对象,它只有3个属性,所有属性都是空的。生命太短暂,无法深入讨论,因此我将标记您的响应作为答案。这只是一个一次性的破解,以绕过网格中的限制,所以我不需要到处重复。谢谢Aran,这非常准确我目前正在使用的解决方案。你很快就想到了,花了我很长时间:-)正如你说的,它非常难看,我希望得到类似{Binding RelativeSource={MultipleRelativeSource Type1=..等的东西。至少新的标记扩展是可重用的。你能创建自己的标记扩展来完成这项工作吗?(我自己从来没有这样做过)我很想看到一个优雅的解决方案。我确实对此进行了研究。编写起来相当简单(只是从MarkupExtension继承)WPF调用了override ProviderValue,我所需要做的就是返回正确的控件。问题是我所拥有的只是绑定,所以我无法确定如何从那里获取控件。这可能不太难,但如果我被卡住了。我可能需要开始一个新的问题,“如何从绑定对象中找到目标":-)如果需要,请提供链接。Cheers我尝试创建一个标记扩展来完全替换绑定,对此进行了研究。对于使用textbox/combobox作为两个父项的示例来说,这很好。调用了ProvideValue,我可以很容易地到达目标。我以为我已经解决了它。但是当我使用在网格中,我得到了一个名为SharedDp的对象,它只有3个属性,所有属性都是空的。生命太短暂,无法进一步深入讨论,因此我将标记您的响应作为答案。这只是一次破解,以绕过网格中的限制,因此我不需要到处重复。我认为在本例中的TemplateParent不是网格。它只用于ControlTemplates,不是吗?我认为在这种情况下TemplateParent不会是网格。它只用于ControlTemplates,不是吗?