Wpf 视觉结构中元素的条件样式

Wpf 视觉结构中元素的条件样式,wpf,xaml,wpf-controls,Wpf,Xaml,Wpf Controls,我很难为下一个问题找到一个通用的解决方案: 想象一个定制的TreeView控件,其中一个;;pws主题化-在单独的xaml文件中有一个元素列表,用于为TreeView控件构建可视化结构。有一个onm Border元素,我想根据dsiplayed的数据类型绘制它的背景。此边框元素是“+”符号的一部分,不会通过样式显示 我可以使用代码隐藏,订阅该控件提供的一些事件,然后在子元素中查找此边框,并更改其背景。但是,此代码将在许多视图中重复,有时完全相同,有时略有不同的修改(例如,仅检查不同的数据元素的类

我很难为下一个问题找到一个通用的解决方案:

想象一个定制的TreeView控件,其中一个;;pws主题化-在单独的xaml文件中有一个元素列表,用于为TreeView控件构建可视化结构。有一个onm Border元素,我想根据dsiplayed的数据类型绘制它的背景。此边框元素是“+”符号的一部分,不会通过样式显示

我可以使用代码隐藏,订阅该控件提供的一些事件,然后在子元素中查找此边框,并更改其背景。但是,此代码将在许多视图中重复,有时完全相同,有时略有不同的修改(例如,仅检查不同的数据元素的类型)

有没有一种方法可以使用其他技术来实现这一点?这里似乎可以使用样式选择器,因为视觉结构不是在该点构建的,所以我无法按其名称搜索该元素。并且该元素不会通过控件上的任何属性公开

编辑:

目前,我的oqwn控件继承了此控件,如果您发现它可以使用附加/依赖属性来完成:

public class MyTreeView : CustomTreeView
{
}
如果我要为一行绘制背景,我会创建一个样式选择器:

<local:ProductRowtyleSelector x:Key="productRowStyleSelector"
                              DefaultStyle="{StaticResource defaultProductRowStyle}"
                              GoodStyle="{StaticResource goodProductRowStyle}"
                              ScrapStyle="{StaticResource reworkProductRowStyle}" />

其中GoodStyle将继承控件模板中存在的行的样式。这样我就可以在任何显示产品列表的地方使用style selecor

对于在控件模板中添加的边框元素,是否有类似的方法可以执行相同的操作?

Edit

好的,如果我得到你需要的,你可以试试这个

创建IValueConverter的IsTypeOf,如下所示:

public class IsTypeOfConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Type parameterType = parameter as Type;
        if (parameterType == null)
            throw new ArgumentException();

        return parameterType.IsAssignableFrom(value.GetType());
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}
然后在您的xaml中,以适用的样式放置一个DataTrigger

<DataTrigger Binding="{Binding Converter={StaticResource IsKindOfConverter}, ConverterParameter={x:Type Person}}">
    <Setter Property="Backgroud" Value="Red" />
</DataTrigger>


Hi Sisyphe,我不想在不同的控件上执行此操作,我已经继承了自定义树视图,如果可能的话,我希望从那里执行此操作。此外,这个逻辑需要应用于行级别,这是items集合的一部分。因此,您想浏览视觉树以查找要处理的特定项目吗?嗨,Sisyphe,我所做的是在主题中添加一个边框元素(x:Name=“MyBorder”)(theme是为该列表控件创建可视结构的xaml文件。假设该列表控件绑定到列表。在代码隐藏中,当在该列表控件上加载一行时,我发现一个子元素的名称为“MyBorder”,并根据客户的Type属性设置其背景。现在想象一下,我将此代码复制粘贴到我有List的每个视图上。另外,我有List,产品也有Type属性。你得到了答案。我想的是找到一种方法来制作一些转换器,或样式选择器,或templateselecor,在那里我可以重用这个在每个视图中。StyleSelector的问题是,当它被触发时,可视化结构还没有构建。所以在这个问题中,我想知道如何使其可重用(不创建静态类并将代码从代码中移到后面)。因此,您希望根据DataContext对象类型为列表框中的行设置不同的背景色,对吗?