0

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

<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,因为根据定义,这就是它们的用途

4

1 回答 1

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}}" />
于 2012-11-06T23:37:54.673 回答