C# 如何创建转换器,使其像;FindAncestor“;用于检查IsTypeFound?

C# 如何创建转换器,使其像;FindAncestor“;用于检查IsTypeFound?,c#,wpf,binding,converter,datatrigger,C#,Wpf,Binding,Converter,Datatrigger,我想创建一个转换器,在该转换器中,我将在元素的父层次结构中传递一个要查找的类型&如果找到这样的类型,它应该返回true,否则返回false 到目前为止,我尝试了以下给定的代码&它正在工作。但现在我唯一的问题是它找到元素的父层次结构,直到元素的父层次结构为null。我想给出在父层次结构中查找元素的祖先级别。那个么我怎样才能给转换器提供祖先级呢 我使用LayoutHelper.cs类在父层次结构中查找元素,如下所示 public class LayoutHelper { public sta

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

到目前为止,我尝试了以下给定的代码&它正在工作。但现在我唯一的问题是它找到元素的父层次结构,直到元素的父层次结构为null。我想给出在父层次结构中查找元素的祖先级别。那个么我怎样才能给转换器提供祖先级呢

我使用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的数据触发器:

 <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self} ,Converter={StaticResource isTypeFoundConverter}, ConverterParameter={x:Type Type_To_Find}}" Value="false">
        <!--Setters-->
  </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中声明其他资源,例如:

        <DataTemplate>
            <DataTemplate.Resources>
                <local:MyConverter x:Key="MyConverterKey"/>
                <local:MyConverterParameter x:Key="MyConverterParameterKey" AncestorType="{x:Type Type-To-Find}" AncestorLevel="1"/>
            </DataTemplate.Resources>

            <!-- DataTemplate tree -->

            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path-To-Bind-To, Converter={StaticResource MyConverterKey}, ConverterParameter={StaticResource MyConverterParameterKey}}" Value="Value-To-Fire-Trigger">
                    <!-- Setters -->
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>


另外,为什么
FindAncestor
mode for不适合您?

因为当它没有找到任何类型时,它不会给出任何值,甚至不为null。。我也尝试过使用回退值,但如果找不到类型,它不会给出任何值,而是在设置路径时抛出绑定异常。。
        <DataTemplate>
            <DataTemplate.Resources>
                <local:MyConverter x:Key="MyConverterKey"/>
                <local:MyConverterParameter x:Key="MyConverterParameterKey" AncestorType="{x:Type Type-To-Find}" AncestorLevel="1"/>
            </DataTemplate.Resources>

            <!-- DataTemplate tree -->

            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path-To-Bind-To, Converter={StaticResource MyConverterKey}, ConverterParameter={StaticResource MyConverterParameterKey}}" Value="Value-To-Fire-Trigger">
                    <!-- Setters -->
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>