0

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

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

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

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

编辑:

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

public class MyTreeView : CustomTreeView
{
}

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

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

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

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

4

1 回答 1

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>
于 2012-10-19T09:00:47.597 回答