2012-06-06 11 views
13

Zajmuję się tworzeniem aplikacji w WPF przy użyciu MVVM, ale utknąłem z obiektami ICommand.Jak włączyć przycisk za pomocą metody CanExecute?

Mam okna, które zawiera kilka przycisków, więc wiążę je do ich ICommand w XAML jak poniżej:

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

Następnie w mojej klasie view-modelu Pisałem następujące:

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; 
    } 
    .... 
} 

Ponieważ potrzebuję, aby mój przycisk nie był włączony przy pierwszym otwarciu okna, ustawiam zmienną isDoSomethingButtonEnabled na false. I to działa, przycisk jest wyłączony na początku, ale moim problemem jest to, że gdy zmienię zmienną isDoSomethingButtonEnabled na true w czasie wykonywania, mój przycisk jest nadal wyłączony.

Wykonałem nawet kilka testów po zmianie zmiennej isDoSomethingButtonEnabled na true, wydrukowaniu wyniku DoSomethingCommand.CanExecute() i wyświetleniu "true"!

Co powinienem zrobić, aby włączyć mój przycisk?

góry dziękuję

+0

MVVM jest wzorcem, nie wymaga żadnych konkretnych klas jak DelegateCommand. Czy korzystasz z PRISM? –

+0

Tak, jestem. Właściwie to muszę go użyć – Dante

Odpowiedz

14

Jest to impreza o nazwie CanExecuteChanged na interfejsie ICommand których:

występuje wtedy, gdy zachodzą zmiany, które wpływają czy komenda powinien wykonać.

Z pryzmat DelegateCommand można podnieść tego zdarzenia z metodą RaiseCanExecuteChanged:

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

dziękuję za odpowiedź. Próbowałem już napisałem, ale mój obiekt ICommand nie ma takiej metody, ma zdarzenie "CanExecuteChanged", czy muszę dodać do niego metodę? – Dante

+1

Już masz tę metodę, wystarczy odrzucić polecenie 'DoSomethingCommand' z' ICommand' na 'DelegateCommand '. W twojej próbce wypróbuj go za pomocą '((DelegateCommand ) DoSomethingCommand) .RaiseCanExecuteChanged();' – nemesv

+0

Lub możesz zmienić typ 'DoSomethingCommand' z' ICommand' na 'DelegateCommand '. – nemesv

Powiązane problemy