目前我们有一个枚举类型,其中每个唯一值由唯一样式表示:
<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,因为根据定义,它们应该用于
答案 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}}" />