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有点了解时,就会出现这样的情况。。。