2014-09-12 58 views
0

我已经申请到一个按钮(默认启用)以下样式:WPF造型工作不正常

<Style x:Key="DisableFoxProCancelButton" 
     TargetType="{x:Type Button}" 
     BasedOn="{StaticResource ButtonStyle}"> 
    <Setter Property="IsEnabled" Value="True" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=FoxProTableIsDirty}" Value="false"> 
      <Setter Property="IsEnabled" Value="False" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

这个工程禁用按钮时FoxProTableIsDirty为False。

我本来这个有线了如下(默认禁用):

<Style x:Key="DisableFoxProCancelButton" 
     TargetType="{x:Type Button}" 
     BasedOn="{StaticResource ButtonStyle}"> 
    <Setter Property="IsEnabled" Value="False" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=FoxProTableIsDirty}" Value="true"> 
      <Setter Property="IsEnabled" Value="True" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

但这第二种方式没有工作,可以禁用按钮时FoxProTableIsDirty为False。

当我编写风格时,第二种风格似乎更有意义,因为默认情况下应该禁用按钮,直到对关联表进行更改并且需要保存更改。

有人可以解释为什么第二个不会按预期工作?

编辑

下面是使用这种风格的按钮的代码:

<Button Name="CancelFoxproChanges" 
      Content="Cancel" 
      Style="{StaticResource DisableFoxProCancelButton}" 
      DockPanel.Dock="Right" 
      HorizontalAlignment="Right"> 

    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Click"> 
      <ei:CallMethodAction TargetObject="{Binding}" 
           MethodName="FoxProCancelButtonClicked" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Button> 
+0

WPF看起来正确乍一看。所以也许问题出在FoxProTableIsDirty属性本身的实现上,而不是WPF。 FoxProTableIsDirty是依赖项属性还是它触发INotifyPropertyChanged事件?我认为它是一个布尔值而不是字符串。 – 2014-09-12 14:50:53

+0

FoxProTableIsDirty是虚拟机上的布尔属性(在启动时设置为False),并且它确实正确地触发了INotifyPropertyChanged事件。 – BrianKE 2014-09-12 15:38:45

+1

我发现问题来自于BasedOn风格。显然MultiDataTriggers没有被重写,但是累积了,BasedOn样式有一个MultiDataTrigger,它将该按钮设置为启用。 – BrianKE 2014-09-17 13:29:27

回答

1

检查是否有IsEnabled集的Button元素。

如果设置为触发器,则不能覆盖本地值或内联值。

<按钮样式= “{StaticResource的DisableFoxProCancelButton}” 的IsEnabled = “假” />


你可以直接绑定FoxProTableIsDirty到按钮的IsEnabled其他方式

,如

<Button IsEnabled="{Binding FoxProTableIsDirty}" /> 

或通过风格设置器

<Setter Property="IsEnabled" Value="{Binding FoxProTableIsDirty}" /> 

只要FoxProTableIsDirty正在解决和通知更改,这将启用/禁用按钮按需要

+0

IsEnabled在Button标签中未被覆盖(请参阅编辑)。我同意按照建议移动这个更好,但想了解为什么它不起作用,正如我最初设置的那样。 – BrianKE 2014-09-12 15:40:48

+0

@BrianKE,你的代码看起来是正确的。进一步分析是否有可能发布您的应用程序的工作示例,它可以重现您遇到的问题? – pushpraj 2014-09-13 01:33:36