2012-06-06 21 views
13

Estoy desarrollando una aplicación en WPF usando MVVM, pero estoy atascado con los objetos ICommand.Cómo habilitar un botón con su método CanExecute

tengo una ventana que contiene algunos botones, por lo que, les unen a sus respectivos ICommand en XAML de la siguiente manera:

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

entonces, en mi clase de vista-modelo que he escrito lo siguiente:

public class MyViewModel : ObservableObject 
{ 

    private bool isDoSomethingButtonEnabled = false; 
    ....   
    public ICommand DoSomethingCommand 
    { 
     get; 
     private set; 
    } 
    .... 
    .... 
    public MyViewModel() 
    { 
     DoSomethingCommand = new DelegateCommand<String>(this.OnDoSomething, this.CanDoSomething); 
    } 

    private void OnDoSomething(String arg) 
    { 

    } 

    private bool CanDoSomething(String arg) 
    { 
     return isDoSomethingButtonEnabled; 
    } 
    .... 
} 

Entonces, como necesito que mi botón no esté habilitado la primera vez que se abre la ventana, configuro mi variable isDoSomethingButtonEnabled en false. Y funciona, el botón está desactivado al principio, pero mi problema es que cuando cambio la variable isDoSomethingButtonEnabled a true en tiempo de ejecución, mi botón sigue deshabilitado.

Incluso me han hecho algunas pruebas después de cambiar la variable isDoSomethingButtonEnabled a true, imprimir el resultado de DoSomethingCommand.CanExecute() y se nota "verdadero"!

Entonces, ¿qué debo hacer para habilitar mi botón?

gracias de antemano

+0

MVVM es un patrón, que no requiere ningún clases específicas como DelegateCommand. ¿Estás usando PRISM? –

+0

Sí, lo soy. De hecho, tengo que usarlo – Dante

Respuesta

14

hay un evento llamado CanExecuteChanged en la interfaz ICommand cuales:

Ocurre cuando se producen cambios que afectan a si o no el comando debe ejecutar.

con el prisma DelegateCommand puede elevar este evento con el método RaiseCanExecuteChanged:

public void SomeMethod() 
{ 
    //do some work 
    isDoSomethingButtonEnabled = true; 
    DoSomethingCommand.RaiseCanExecuteChanged(); 
} 
+0

gracias por su respuesta. He intentado lo que acaba de escribir, pero mi objeto ICommand no tiene dicho método. Tiene el evento 'CanExecuteChanged', ¿necesito agregarle un método? – Dante

+1

Ya tiene este método, solo necesita devolver su 'DoSomethingCommand' de' ICommand' a 'DelegateCommand '. En su ejemplo, inténtelo con '((DelegateCommand ) DoSomethingCommand) .RaiseCanExecuteChanged();' – nemesv

+0

O puede cambiar el tipo de 'DoSomethingCommand' de' ICommand' a 'DelegateCommand '. – nemesv

Cuestiones relacionadas