2016-10-27 8 views
1

Я использую предопределенный стиль как Style="{DynamicResource SquareButtonStyle}"Использование DynamicResource Стиль и DataTrigger для кнопки в XAML

, которые не могут быть изменены, и мне нужно, чтобы включить/отключить Button через DataTrigger.

похоже не возможно?

Ошибка: свойство 'Style' установлено более одного раза.

<Button Content="Guardar" Width="100" Style="{DynamicResource SquareButtonStyle}" Name="SaveTemplateATM" Click="SaveTemplateATM_Click"> 
    <Button.Style> 
     <Style TargetType="{x:Type Button}"> 
       <Style.Triggers> 
         <DataTrigger Binding="{Binding Text.Length, ElementName=UserName, UpdateSourceTrigger=PropertyChanged}" Value="0"> 
          <Setter Property="IsEnabled" Value="False"/> 
         </DataTrigger>           
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

ответ

2

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

<Button Content="Guardar" Width="100" Name="SaveTemplateATM" Click="SaveTemplateATM_Click"> 
    <Button.Style> 
     <Style 
      TargetType="{x:Type Button}" 
      BasedOn="{StaticResource SquareButtonStyle}" 
      > 
      <Style.Triggers> 
       <DataTrigger 
        Binding="{Binding Text.Length, ElementName=UserName}" 
        Value="0" 
        > 
        <Setter 
         Property="IsEnabled" 
         Value="False" 
         /> 
       </DataTrigger>           
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

Кроме того, UpdateSourceTrigger=PropertyChanged в лучшем случае безвредны, но вы не хотите его, что связывание. Что этот флаг делает, чтобы рассказать Binding как обновить источник свойства для связывания (это UserName.Text.Length в данном случае), когда цели изменения свойств (что в данном случае Button.IsEnabled). Это не имеет смысла здесь: даже если UserName.Text.Length не были только для чтения, то Binding никогда не обновлял его, и вы бы этого не хотели.

В UpdateSourceTrigger флагах для изменения поведения по умолчанию два односторонних привязок, например, если вы связывание Text свойства TextBox свойству ViewModel строки, поведение по умолчанию, чтобы обновить свойство ViewModel когда TextBox теряет фокус. Вы можете захотеть, чтобы он обновлялся каждый раз, когда пользователь вводит символ - в этом случае вы должны дать BindingUpdateSourceTrigger=PropertyChanged.

+0

Спасибо! когда я использую ваш код, я получаю сообщение «Дополнительная информация:« DynamicResourceExtension »не может быть задано в свойстве« BasedOn »типа« Стиль ». «DynamicResourceExtension» может быть установлен только в DependencyProperty объекта DependencyObject. –

+0

@ Dimi Hmm. Нехорошо. Позволит ли вы использовать 'StaticResource' вместо' DynamicResource'? –

+0

Да, да. Спасибо! –

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

  • Нет связанных вопросов^_^