XAML 中的按钮使用 DynamicResource Style 和 DataTrigger

Using DynamicResource Style and DataTrigger for button in XAML

我正在使用像 Style="{DynamicResource SquareButtonStyle}"

这样的预定义样式

无法修改,我需要通过 DataTrigger.

enable/disable 一个 Button

好像做不到?

The error is: The property 'Style' is set more than once.

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

您只能设置样式属性(或任何属性)一次,但您可以将其设置为基于资源样式的新样式。这意味着它将继承资源样式所具有的所有内容,并且还将具有您自己添加的所有内容。

<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 在这里充其量是无害的,但您不希望它出现在那个绑定上。当target 属性 更改(在本例中为 Button.IsEnabled)。这在这里没有意义:即使 UserName.Text.Length 不是只读的,Binding 也永远不会更新它,您也不希望它更新。

UpdateSourceTrigger 标志用于修改双向绑定的默认行为,例如,如果您将 TextBoxText 属性 绑定到视图模型字符串 属性,默认行为是在 TextBox 失去焦点时更新视图模型 属性。您可能希望它在每次用户键入字符时更新——在这种情况下,您会给出 Binding UpdateSourceTrigger=PropertyChanged