如何创建像“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>
在这里,在数据触发器中,如何将祖先级别传递给转换器,以便我只能找到该级别的元素?
谢谢阿莫尔·巴万纳瓦尔
声明一个类型以包含转换器参数:
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
模式不适合您?