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

本文关键字:一样 工作 转换器 IsTypeFound 检查 创建 何创建 FindAncestor | 更新日期: 2023-09-27 18:32:15

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

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

我使用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;
    }
}

DataTrigger with IsTypeFoundConverter :

 <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self} ,Converter={StaticResource isTypeFoundConverter}, ConverterParameter={x:Type Type_To_Find}}" Value="false">
        <!--Setters-->
  </DataTrigger>

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

谢谢阿莫尔·巴万纳瓦尔

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

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

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 RealtiveSource模式不适合您?