J'ai un bouton et une zone de texte dans mon application WPF. Comment puis-je désactiver le bouton jusqu'à ce que l'utilisateur entre du texte dans la zone de texte?
Cela devrait le faire:
<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>
Dans MVVM (ce qui rend beaucoup de choses beaucoup plus faciles - vous devriez l'essayer), vous auriez deux propriétés dans votre ViewModel Text
qui est lié à votre TextBox et vous auriez une propriété ICommand Apply
(ou similaire) qui est liée au bouton:
<Button Command="Apply">Apply</Button>
L'interface ICommand
a une méthode CanExecute
qui vous permet de renvoyer true
if (!string.IsNullOrWhiteSpace(this.Text)
. Le reste est fait par WPF pour vous (activation/désactivation, exécution de la commande réelle au clic).
L'article lié l'explique en détail.
Par code:
btn_edit.IsEnabled = true;
Par XAML:
<Button Content="Edit data" Grid.Column="1" Name="btn_edit" Grid.Row="1" IsEnabled="False" />
Je sais que ce n'est pas aussi élégant que les autres articles, mais c'est un exemple plus simple de xaml/codebehind sur la façon d'accomplir la même chose.
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>
CodeBehind:
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
Vous pouvez vous abonner à l'événement TextChanged
sur le TextBox
et si le texte est vide, définissez le Button
sur désactivé. Ou vous pouvez lier le Button.IsEnabled
propriété à TextBox.Text
et utilisez un convertisseur qui renvoie true s'il y a du texte et false sinon.