2010-08-13 13 views
16

Estoy tratando de entender a WPF y MVVM y he progresado mucho. El lado WPF y MVVM está yendo bien. lado¿Cómo se "desactiva" un botón en WPF usando el patrón MVVM?

Sin embargo, el XAML y el enlace de datos es otra historia :)

¿Cómo hago para un botón "incapacitante"?

Por ejemplo, tengo una propiedad CanClose en mi modelo de vista que determina si la aplicación se puede cerrar actualmente o no. Si un subproceso de trabajo está desactivado haciendo algo, esta propiedad se configura como falsa y me gustaría tapar el botón o inhabilitar visualmente el botón Cerrar mediante algún tipo de enlace.

¿Cómo voy a hacer esto?

Gracias!

Editar -

Lástima que sólo puede aceptar una respuesta.

Estas dos respuestas me han ayudado tremendamente. En el post de Kent, fue un paso más allá al explicar por qué se debe implementar una infraestructura de comandos de la aplicación en lugar de deshabilitar un botón en la forma en que había pedido:

How does one "disable" a button in WPF using the MVVM pattern?

Y la respuesta a mi pregunta original :

How does one "disable" a button in WPF using the MVVM pattern?

Respuesta

28

Utilizando el patrón de comando. En el modelo de vista:

public class MyViewModel : ViewModel 
{ 
    private readonly ICommand someCommand; 

    public MyViewModel() 
    { 
     this.someCommand = new DelegateCommand(this.DoSomething, this.CanDoSomething); 
    } 

    public ICommand SomeCommand 
    { 
     get { return this.someCommand; } 
    } 

    private void DoSomething(object state) 
    { 
     // do something here 
    } 

    private bool CanDoSomething(object state) 
    { 
     // return true/false here is enabled/disable button 
    } 
} 

en su XAML:

<Button Command="{Binding SomeCommand}">Do Something</Button> 

Leer this post para averiguar más sobre la DelegateCommand.

+0

Buen enlace, gracias por la información. Lo leeré todo esta tarde cuando tenga algo de tiempo libre adicional. Lo tomo DelegateCommand es su propia implementación del patrón de comando, o es algo que me falta en el framework .net? –

+0

@IanP DelegateCommand es parte de Prism que parece ser la forma de facto de escribir aplicaciones WPF actualmente ... – BFree

+0

Hmm .. Sin saber qué hace DelegateCommand, esto no me ayuda tanto como esperaba ... lol –

31

Sólo enlazar la propiedad IsEnabled del botón para CanClose:

<Button IsEnabled="{Binding CanClose}"/> 
+0

De ninguna manera, ¿es realmente tan fácil? No tengo idea de cómo podría haber pasado por alto eso. Déjame intentarlo. –

+1

Gracias, no puedo creer que haya pasado por alto una respuesta tan fácil al problema. –

9

Si devuelve CanExecute of ICommand un valor de falso, se desactivará el botón. Entonces, cualquiera que sea el comando al que está obligado su botón, vea si puede devolver CanExecute un valor de falso cuando quiera deshabilitarlo.

+0

+1 respuesta directa. No estoy seguro de por qué esta respuesta está en la parte inferior. – rpattabi

1

Esto también funciona:

Ver:

 <Button> 
      <Button.Style> 
       <Style> 
        <Setter Property="Content" Value="Scream" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding btnEnabled}" Value="True"> 
          <Setter Property="IsEnabled" Value="True" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Button.Style> 
     </Button> 

modelo de vista:

private bool _btnEnabled; 
    public bool btnEnabled 
    { 
     get { return _btnEnabled; } 
     set 
     { 
      if (_btnEnabled != value) 
      { 
       _btnEnabled = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 
Cuestiones relacionadas