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

时间:2012-10-19 08:37:57

标签: wpf xaml wpf-controls

我无法为下一个问题制作通用解决方案:

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

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

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

编辑:

目前我正在使用继承此控件的oqwn控件,如果你发现它可以使用Attached / depenency属性完成:

public class MyTreeView : CustomTreeView
{
}

如果我要为一行添加背景,我会创建一个样式选择器:

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

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

对于我在控件模板中添加的Border元素,是否有类似的方法?

1 个答案:

答案 0 :(得分:0)

修改

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

像这样创建一个IsTypeOf IValueConverter:

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>