C# WPF按钮';s样式被命令绑定不适当地覆盖

C# WPF按钮';s样式被命令绑定不适当地覆盖,c#,wpf,C#,Wpf,简单的问题,真的。我使用一些简单的绑定和样式触发器定义了以下按钮: <Button HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderBrush="Transparent" BorderThickness="0" Command="{Binding AcceptValueInputCommand}"> <Button.Style> <Style TargetType="{x:T

简单的问题,真的。我使用一些简单的绑定和样式触发器定义了以下按钮:

<Button HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderBrush="Transparent" BorderThickness="0" Command="{Binding AcceptValueInputCommand}">
  <Button.Style>
    <Style TargetType="{x:Type Button}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding ValueInputEnabled}" Value="True">
          <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
        <DataTrigger Binding="{Binding IsPredefined}" Value="True">
          <Setter Property="Background" Value="Red" />
          <Setter Property="Foreground" Value="Black" />
        </DataTrigger>
      </Style.Triggers>
      <Setter Property="Visibility" Value="Visible"/>
      <Setter Property="Background" Value="White" />
      <Setter Property="Foreground" Value="Black" />
    </Style>
  </Button.Style>
  <Viewbox>
    <TextBlock Text="{Binding Value}" />
  </Viewbox>
</Button>

我遇到的问题是,我在“IsPredefined”上的触发器没有将按钮的背景设置为红色。前景确实被正确地设置为黑色(尽管我不知道为什么它没有从样式之外的设置器中拾取)。我认为问题与按钮上的命令绑定有关,因为如果我注释掉绑定,按钮会突然变红!(注意,在所有情况下,当“IsPredefined”的计算结果为true时,命令的CanExecute()应计算为false)。有什么想法吗


(编辑后,将黑色的前景添加到IsPredefined触发器中)。

这是因为当CanExecute返回false时,按钮将被禁用,样式触发器将被按钮的默认控件模板中定义的控件模板触发器覆盖,该控件模板触发器将背景设置为灰色

如果你想改变它,你必须覆盖默认模板的按钮,并摆脱触发器负责设置为灰色。此示例应适用于:

<Button HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderBrush="Transparent" BorderThickness="0" Command="{Binding AcceptValueInputCommand}">
    <Button.Template>
        <ControlTemplate TargetType="ButtonBase">
            <Border BorderThickness="{TemplateBinding Border.BorderThickness}"
                    BorderBrush="{TemplateBinding Border.BorderBrush}"
                    Background="{TemplateBinding Panel.Background}"
                    Name="border"
                    SnapsToDevicePixels="True">
                <ContentPresenter RecognizesAccessKey="True"
                                    Content="{TemplateBinding ContentControl.Content}"
                                    ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
                                    ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}"
                                    Name="contentPresenter"
                                    Margin="{TemplateBinding Control.Padding}"
                                    HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                                    VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
                                    SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"
                                    Focusable="False" />
            </Border>
        </ControlTemplate>
    </Button.Template>
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsEnable}" Value="True">
                    <Setter Property="Background" Value="Red" />
                    <Setter Property="Foreground" Value="Black" />
                </DataTrigger>
            </Style.Triggers>
            <Setter Property="Visibility" Value="Visible"/>
            <Setter Property="Background" Value="White" />
            <Setter Property="Foreground" Value="Black" />
        </Style>
    </Button.Style>
    <Viewbox>
        <TextBlock Text="{Binding Value}" />
    </Viewbox>
</Button>


尝试将按钮的OveridesDefaultStyle属性设置为true。@mgarant刚刚尝试过,然后我的按钮的所有内容都消失了。仅供参考,我只需将前景设置器与背景设置器放在同一触发器中,就可以设置了…谢谢!这很有效。现在,我必须研究它,以了解它为什么有效。每当我开始认为我对WPF有点了解时,就会出现这样的情况。。。