【发布时间】:2014-09-12 03:22:50
【问题描述】:
我的 Button 控件有一个样式模板,如下所示:
<Style x:Key="myBtnStyle" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border" Width="100" Height="25"
Padding="5,5,5,5" CornerRadius="5,5,5,5"
Background="LightGray" BorderBrush="Black"
BorderThickness="1,1,1,1">
<ContentPresenter
x:Name="cpButton"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Width="Auto" Height="Auto" Margin="-6">
</ContentPresenter>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="border" Value="GhostWhite"></Setter>
<Setter Property="BorderBrush" TargetName="border" Value="Gainsboro"></Setter>
<Setter Property="Foreground" Value="Gray"></Setter>
</Trigger>
<Trigger Property="IsPressed" Value="true">
<Setter Property="Background" TargetName="border" Value="SkyBlue"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
我的按钮实例本身:
<Button Name="btnResetCount" Content="Reset" Command="{Binding Path=CalcViewModel.ResetCounter}" Style="{StaticResource myBtnStyle}" IsEnabled="{Binding IsButtonCounterEnabled,Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
IsEnabled 属性的绑定工作正常。所以 IsEnabled 从我的 ViewModel 中得到正确设置。
但我的问题是我的 IsEnabled <ControlTemplate.Triggers> 的样式不会在 UI 中自动加载/刷新。我总是必须先单击任何其他控件。一旦我点击另一个控件,按钮的样式也会改变。
如何根据 IsEnabled 事件自动更新/刷新按钮/任何控件的样式?
编辑:
最后我得到了一个解决方法。我不高兴,我确信有更好的方法。但它有效。
在我的 ViewModel 中我实现了:
CommandManager.InvalidateRequerySuggested();
通过调用此方法,控件得到刷新。 如果给定启用按钮的条件,我只是在我的属性之一中调用它..
提前致谢!
【问题讨论】: