2010-05-25 18 views
42

Tengo un botón y un cuadro de texto en mi aplicación WPF. ¿Cómo puedo hacer que el botón no se active hasta que el usuario ingrese texto en el cuadro de texto?Botón Deshabilitar en WPF?

Respuesta

43

Esto debe hacerlo:

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

Es mucho más elegante hacer la validación en el ViewModel. Eche un vistazo al artículo de Josh Smith bitbonk vinculado a. –

+3

@Helge Klein, estoy absolutamente de acuerdo, pero como el OP no especificó que estaba usando MVVM y no es trivial cambiar a él si no está familiarizado, pensé que respondería de la forma más simple posible moda. –

+1

Entiendo. Solo quería apuntar a los lectores futuros a la solución "mejor" si inicialmente es más compleja. –

0

Puede suscribirse al evento TextChanged en el TextBox y si el texto está vacío, configure el Button como deshabilitado. O puede vincular la propiedad Button.IsEnabled a la propiedad TextBox.Text y usar un convertidor que devuelva verdadero si hay texto y falso de lo contrario.

+0

WPF es sin t windows forms habits ... – msfanboy

16

En MVVM (wich hace un montón de cosas mucho más fácil - usted debe probarlo) que tendría dos propiedades en su modelo de vista Text que está obligado a su cuadro de texto y que tendría una propiedad ICommand Apply (o similar) que está unido al botón:

<Button Command="Apply">Apply</Button> 

la interfaz tiene un método ICommandCanExecute que es donde regresa trueif (!string.IsNullOrWhiteSpace(this.Text). El resto lo hace WPF por usted (habilitando/deshabilitando, ejecutando el comando real al hacer clic).

El artículo vinculado lo explica en detalle.

5

Sé que esto no es tan elegante como las otras publicaciones, pero es un ejemplo más sencillo de xaml/codebehind de cómo lograr lo mismo.

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

Windows 8 beta va a ser la única posibilidad de lograr esto. Al menos por hoy. –

11

Por código:

btn_edit.IsEnabled = true; 

Por XAML:

<Button Content="Edit data" Grid.Column="1" Name="btn_edit" Grid.Row="1" IsEnabled="False" /> 
Cuestiones relacionadas