2012-11-06 68 views
0

目前我们有每个独特的价值正在被一种独特的风格为代表的枚举类型:如何将一组样式转换为枚举类型的DataTemplates?

<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> 

目前的复选框被编程的方式创建的代码隐藏 - 我改变了这绑定到一个列表框收集这些枚举值,我认为将它们转换为DataTemplate是有意义的 - 问题是,如何最大限度地重用?

我有大约10个独特的价值观和10个独特的风格...的风格9/10使用相同的二传手,在ControlTemplate.Triggers是所有10个相同的,但很显然,在ControlTemplate中的可视化树不同的是

我想过使用基本样式类,并有每一个具体的变取得/与其他样式覆盖它并使用StyleSelector,但我会如何改变每风格的ControlTemplate可视化树,而不必重新定义了触发器?

但这似乎“哲学”错了......我觉得我应该使用的DataTemplates,因为这是由定义他们的意思是使用了

回答

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}}" /> 
+0

这样的工作,但我不能在这种情况下使用ItemTemplateSelector类? 说实话,我更关心我应该如何管理我的样式/数据模板,以最大限度地减少冗余和更易于管理的策略,而不是如何连接它们 – blue18hutthutt

+0

我想使用数据模板而不是样式,以便它们是数据类型和它们的值的函数..现在我不喜欢样式是如何写在复选框上的 – blue18hutthutt

+0

除非我不理解您的意图,否则您应该能够利用相同的解决方案在绑定范围内的任何地方。例如,如果此样式所属的复选框位于项目控件内的数据模板中,则可以使用转换器实现定义为应用程序资源的数据模板选择。 如果是我,我会使用转换器代替ItemTemplateSelector,因为我发现实现更干净,更具可扩展性。 我希望这有助于。 – XamlZealot

相关问题