2014-09-12 3 views
0

У меня есть следующий стиль, примененный к кнопке (по умолчанию включено):WPF Styling не работает должным образом

<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.

Второй стиль, казалось, имел больше смысла, когда я писал стиль, поскольку по умолчанию кнопка должна быть отключена до тех пор, пока не будет внесено изменение в соответствующую таблицу, и изменения должны быть сохранены.

Может кто-нибудь объяснить, почему второй не будет работать так, как ожидалось?

EDIT

Вот код для кнопки, используя этот стиль:

<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? Я предполагаю, что это булевская строка. –

+0

FoxProTableIsDirty - это логическое свойство (установлено в False при запуске) на виртуальной машине и оно корректно запускает событие INotifyPropertyChanged. – BrianKE

+1

Я обнаружил, что проблема исходила из стиля BasedOn. По-видимому, MultiDataTriggers не переоцениваются, но кумулятивны, а стиль BasedOn имеет MultiDataTrigger, который настраивал кнопку для включения. – BrianKE

ответ

1

проверить, есть ли IsEnabled набор в Button элемента.

удалить, если он установлен как триггеры, не может переопределять локальные или встроенные значения.

< Кнопка Style = "{StaticResource DisableFoxProCancelButton}" IsEnabled = "False" />


другим способом вы можете напрямую связать FoxProTableIsDirty с IsEnabled Баттона, например

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

или через устройства для формовки

до тех пор, пока FoxProTableIsDirty будет решен и будет уведомлен об изменениях, это позволит включить/отключить кнопку по желанию

+0

IsEnabled НЕ переопределяется в теге Button (см. Редактирование). Я согласен с тем, что переместить это, как было предложено, лучше, но хотелось бы понять, почему он не работает, поскольку я изначально его настроил. – BrianKE

+0

@BrianKE, ваш код выглядит правильно. для дальнейшего анализа можно ли разместить рабочий образец вашего приложения, который может воспроизвести проблему, с которой вы сталкиваетесь? – pushpraj

Смежные вопросы