在WPF中禁用按钮?

san*_*084 48 wpf textbox button

我的WPF应用程序中有一个Button和一个TextBox.在用户在TextBox中输入某些文本之前,如何才能启用Button?

Ste*_*rex 48

这应该这样做:

<StackPanel>
    <TextBox x:Name="TheTextBox" />
    <Button Content="Click Me">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="IsEnabled" Value="True" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Text, ElementName=TheTextBox}" Value="">
                        <Setter Property="IsEnabled" Value="False" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

  • @Helge Klein,我绝对同意,但由于OP没有说明他正在使用MVVM,如果你不熟悉,切换到它并不是一件容易的事情,我想我会尽可能简单地回答时尚. (4认同)
  • 在ViewModel中进行验证更加优雅.看看Josh Smith bitbonk链接到的文章. (3认同)
  • 我明白.如果最初更复杂的解决方案,我只想将未来的读者指向"更好". (2认同)

bit*_*onk 19

MVVM中(这使得很多东西变得容易很多 - 你应该尝试一下)你的ViewModel Text中有两个绑定到TextBox的属性,你将拥有一个Apply绑定到按钮的ICommand属性(或类似):

<Button Command="Apply">Apply</Button>
Run Code Online (Sandbox Code Playgroud)

ICommand接口有一个方法CanExecute就是,你返回true if (!string.IsNullOrWhiteSpace(this.Text).其余的由WPF为您完成(启用/禁用,在单击时执行实际命令).

链接的文章详细解释了它.

  • 这需要更多的赞成票,并应标记为答案。正如 @jairhumberto 指出的,纯粹用 XAML 来做这件事确实很糟糕。MVVM 有一点学习曲线,但正如这个答案所说,一旦您使用 MVVM,问题的解决方案就会非常简单。 (2认同)

dan*_*004 15

按代码:

btn_edit.IsEnabled = true;
Run Code Online (Sandbox Code Playgroud)

通过XAML:

<Button Content="Edit data" Grid.Column="1" Name="btn_edit" Grid.Row="1" IsEnabled="False" />
Run Code Online (Sandbox Code Playgroud)


spo*_*ong 5

我知道这不像其他帖子那么优雅,但它是一个更简单的xaml/codebehind示例,说明如何完成同样的事情.

XAML:

<StackPanel Orientation="Horizontal">
   <TextBox Name="TextBox01" VerticalAlignment="Top" HorizontalAlignment="Left" Width="70" />
   <Button Name="Button01" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,0,0,0" />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

代码隐藏:

Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded

        Button01.IsEnabled = False
        Button01.Content = "I am Disabled"

End Sub

Private Sub TextBox01_TextChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.TextChangedEventArgs) Handles TextBox01.TextChanged

        If TextBox01.Text.Trim.Length > 0 Then
            Button01.IsEnabled = True
            Button01.Content = "I am Enabled"
        Else
            Button01.IsEnabled = False
            Button01.Content = "I am Disabled"
        End If

End Sub
Run Code Online (Sandbox Code Playgroud)