子控件的样式,根据绑定更改其外观

时间:2013-03-01 08:48:15

标签: wpf xaml data-binding mvvm styles

我有一个自定义控件绑定到几个属性,我想分开样式,但我遇到了问题。 基本上它是一个内置ContentControl的Button。 Button样式依赖于PropertyA(bool),但ContentControls样式依赖于PropertyA和PropertyB(具有5个元素的枚举)。

<Button Style="{Binding PropertyA, Converter={StaticResource styleSelector}}">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            [...]
            <ContentControl x:Name="cc1">
                <ContentControl.Template>
                    <MultiBinding Converter="{StaticResource contentSelector}">
                        <Binding Path="PropertyA" />
                        <Binding Path="PropertyB" />
                     </MultiBinding>
                 </ContentControl.Template>
            </ContentControl>
            [...]
        </ControlTemplate>
    </Button.Template>
</Button>

将样式移至资源

<Style x:Key="ButtonStyleA1" TargetType="Button">
   [...]
</Style>

<Style x:Key="ButtonStyleA2" TargetType="Button">
   [...]
</Style>

因为ContentControl是Button的一部分,所以应该可以将ContentControl的模板移动到ButtonStyleA1ButtonStyleA2,并减少对PropertyB的依赖。 我尝试在样式中使用<Setter ... TargetName="cc1">,但编译器找不到cc1。 您是否有一个简单而干净的解决方案,其中绑定仍保留在Button中?

非常感谢!

1 个答案:

答案 0 :(得分:0)

最简单的方法可能是在Button样式中设置Button的ControlTemplate属性。然后,您可以根据需要为按钮定义任意数量的样式,每个样式都包含自己的ControlTemplate,这些样式是根据 PropertyA 的值选择的。

在每个ControlTemplate中,您可以使用样式触发器将内容控件的模板设置为五个中的一个。您可以将内容控件的模板定义为Button的ControlTemplate或其他位置的资源,具体取决于您希望如何组织它。

我希望,我的问题是正确的,这对您的情况有帮助。

修改

如果您需要从后面的代码访问ContentControl,可以定义模板部分来执行此操作。