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>

現在、チェックボックスはコードビハインドでプログラムによって作成されています-これをこれらの列挙値のコレクションにバインドされたリストボックスに変更しています。代わりにこれらをDataTemplateに変換するのが理にかなっていると思います-質問は、どのように再最大化するかです-使用する?

およそ10個の一意の値と10個の一意のスタイルがあります...9/10のスタイルは同じセッターであるControlTemplate.Triggersを使用しますが、10個すべてで同じですが、ControlTemplateのビジュアルツリーは明らかに異なります

基本のStyleクラスを使用し、各特定のバリアントを別のスタイルで派生/オーバーライドしてStyleSelectorを使用することを考えましたが、トリガーを再定義せずに、スタイルごとにControlTemplateビジュアルツリーを変更するにはどうすればよいですか?

しかし、これは「哲学的に」間違っているようです... DataTemplatesを使用する必要があるように感じます。これは、定義上、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 に答える