如何为枚举类型将一组样式转换为DataTemplates?

时间:2012-11-06 17:17:06

标签: wpf

目前我们有一个枚举类型,其中每个唯一值由唯一样式表示:

<Style x:Key="EnumValue1" TargetType="CheckBox">
<Setter Property="FontSize" Value="11" />
<Setter Property="Margin" Value="0 0 1 0" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="Height" Value="18" />
<!-- ... common property setters etc. -->

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="CheckBox">
            <Border>
                <StackPanel>
                    <!-- custom enum value-specific control content -->
                    <ContentPresenter Content="{TemplateBinding Content}" />
                </StackPanel>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Trigger.Setters>
                        <Setter Property="Foreground" Value="WhiteSmoke" />
                    </Trigger.Setters>
                </Trigger>
                   <!-- ... custom triggers etc ... -->
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Setter.Value>
</Setter>
</Style>

目前正在以编程方式在代码隐藏中创建复选框 - 我将其更改为绑定到这些枚举值集合的ListBox,我认为将它们转换为DataTemplate是有意义的 - 问题是,如何做我最大限度地重复使用?

我有大约10个独特的值和10个独特的样式... 9/10的样式使用相同的Setter,ControlTemplate.Triggers对于所有10个相同但显然ControlTemplate中的可视树是不同的

我考虑过使用基类Style类并让每个特定变体使用另一个Style派生/覆盖它并使用StyleSelector,但是如何在不必重新定义触发器的情况下改变每个样式的ControlTemplate可视化树?

但这似乎是“哲学上的”错误......我觉得我应该使用DataTemplates,因为根据定义,它们应该用于

1 个答案:

答案 0 :(得分:0)

您是否可以创建一个ValueConverter来评估枚举值并返回相应的模板?

public enum TemplateEnum
{
    firstValue,
    secondValue
}

public class TemplateConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {

        var templateEnum = (TemplateEnum)value;
        switch (templateEnum)
        {
            case TemplateEnum.firstValue:
                return Application.Current.Resources["FirstValueTemplate"];
            case TemplateEnum.secondValue:
                return Application.Current.Resources["SecondValueTemplate"];
            default:
                return null;
        }
    }
}

<ContentPresenter Content="{Binding EnumVal, Converter={x:Static local:Converters.templateConverter}}" />