我有一个按钮控件,该控件的 Content 属性绑定到视图模型上的布尔属性。该按钮用于通过异步 WCF 调用打开和关闭工业机器上的阀门。当服务返回时,它会更新布尔属性,从而触发对按钮视觉状态的更改。这是按钮 xaml:
<Button Command="{Binding Path=OpenCloseValveCommand}"
Content="{Binding Path=ValveIsOpen}"
Style="{StaticResource ResourceKey=OnOffButtonStyle}">
阀门打开时按钮需要为绿色,阀门关闭时按钮需要为红色并带有十字。这是样式 xaml:
<Style TargetType="Button" x:Key="OnOffButtonStyle" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Canvas>
<Rectangle x:Name="_rect" Fill="Red" Stroke="Black" Width="30" Height="30"></Rectangle>
<Path x:Name="_path" Data="M0,0 L30,30 M0,30 L30,0" StrokeThickness="1" Stroke="Black" />
</Canvas>
<ControlTemplate.Triggers>
<Trigger Property="Content" Value="true">
<Setter TargetName="_rect" Property="Fill" Value="Lime" />
<Setter TargetName="_path" Property="Visibility" Value="Hidden" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
不幸的是,触发器似乎没有触发。我猜这与按钮内容绑定到布尔类型有关 - 我是否需要使用"true"以外的内容作为触发值?(如果我将 viewmodel 属性更改为整数并使用 0 或 1,并且触发器值为"1",则触发器有效)。
提前致谢
安 迪
您可以显式指定类型:
<Window ...
xmlns:sys="clr-namespace:System;assembly=mscorlib"
...>
<Trigger Property="Content">
<Trigger.Value>
<sys:Boolean>True</sys:Boolean>
</Trigger.Value>
<Setter TargetName="_rect" Property="Fill" Value="Lime" />
<Setter TargetName="_path" Property="Visibility" Value="Hidden" />
</Trigger>
为此
使用DataTrigger
:
<Button Command="{Binding Path=OpenCloseValveCommand}"
Style="{StaticResource ResourceKey=OnOffButtonStyle}">
<Style TargetType="Button" x:Key="OnOffButtonStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Canvas>
<Rectangle x:Name="_rect" Fill="Red" Stroke="Black" Width="30" Height="30"></Rectangle>
<Path x:Name="_path" Data="M0,0 L30,30 M0,30 L30,0" StrokeThickness="1" Stroke="Black" />
</Canvas>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding ValveIsOpen}" Value="True">
<Setter TargetName="_rect" Property="Fill" Value="Lime" />
<Setter TargetName="_path" Property="Visibility" Value="Hidden" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>