如何创建转换器像“FindAncestor”一样工作以检查IsTypeFound?

我想创建一个转换器,在其中我将传递一个类型来查找,在元素的父层次结构中,如果找到这样的类型,它应该返回true,否则返回false。

到目前为止,我尝试下面的代码,它正在工作。 但现在只有我有问题是它找到元素父层次结构,直到元素的父元素为空。 我想给祖先级别找到父层次结构中的元素。 那么如何才能将Ancestor Level赋予转换器?

我使用LayoutHelper.cs类来查找父层次结构中的元素,如下所示。

public class LayoutHelper { public static FrameworkElement FindElement(FrameworkElement treeRoot, Type type, int AncestorLevel) { FrameworkElement parentElement = VisualTreeHelper.GetParent(treeRoot) as FrameworkElement; int level = 1; while (parentElement != null && level <= AncestorLevel) { if (parentElement.GetType() == type) return parentElement; else parentElement = VisualTreeHelper.GetParent(parentElement) as FrameworkElement; level++; } return null; } } 

IsTypeFoundConverter.cs: –

 public class IsTypeFoundConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { FrameworkElement element = value as FrameworkElement; Type type = parameter as Type; if (element != null && type != null) { element = LayoutHelper.FindElement(element, type,5); if (element != null) return true; } return false; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return value; } } 

带有IsTypeFoundConverter的DataTrigger:

     

在这里,在数据触发器中如何将AncestorLevel传递给转换器,所以我只能找到该级别的元素?

谢谢,Amol bavannavar

声明一个包含转换器参数的类型:

 public sealed class MyConverterParameter { public Type AncestorType { get; set; } public int AncestorLevel { get; set; } } 

重写转换器使用此类型:

 public sealed class MyConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var myParameter = (MyConverterParameter)parameter; // other converter stuff here } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { var myParameter = (MyConverterParameter)parameter; // other converter stuff here } } 

在XAML中声明其他资源,例如:

              

PS为什么RealtiveSource FindAncestor模式不适合你?