2010-08-13 10 views
16

Sto cercando di capire su WPF e MVVM e sto facendo buoni progressi. Il lato WPF e MVVM stanno andando bene. latoCome si "disabilita" un pulsante in WPF usando il pattern MVVM?

Tuttavia, il codice XAML e data binding è tutta un'altra storia :)

Come potrei fare per "disattivazione" un pulsante?

Ad esempio, ho una proprietà CanClose nel mio modello di vista che determina se l'applicazione può attualmente essere chiusa o meno. Se un thread di lavoro non è attivo, questa proprietà è impostata su false e vorrei disattivare il pulsante in grigio o in qualche modo disabilitare visivamente il pulsante Chiudi tramite una sorta di associazione.

Come faccio a fare questo?

Grazie!

Edit -

Peccato posso accettare una sola risposta.

Queste due risposte mi hanno aiutato moltissimo. Nel post di Kent, è andato un ulteriore passo avanti spiegando il motivo per cui si dovrebbe implementare un'infrastruttura di comando nella vostra applicazione, invece di disattivazione di un tasto nel modo in cui avevo chiesto:

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

E la risposta alla mia domanda iniziale :

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

risposta

28

Utilizzando il modello di comando. Secondo lei il modello:

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

Nel vostro XAML:

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

Leggi this post per saperne di più circa la DelegateCommand.

+0

Bel collegamento, grazie per le informazioni. Leggerò tutto questo pomeriggio quando avrò un po 'di tempo libero aggiuntivo. Prendilo DelegateCommand è la tua implementazione del pattern di comando, o è qualcosa nel framework .net che mi manca? –

+0

@IanP DelegateCommand fa parte di Prism che sembra essere di fatto il modo di scrivere app WPF in questi giorni .... – BFree

+0

Hmm .. Senza sapere cosa fa DelegateCommand, questo non mi aiuta quanto avevo sperato .. lol –

31

Basta associare la proprietà IsEnabled del pulsante per CanClose:

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

Niente da fare, è davvero così facile? Non ho idea di come avrei potuto ignorarlo. Fammi provare. –

+1

Grazie, non posso credere di aver trascurato una risposta così facile al problema. –

9

Se si restituisce CanExecute di ICommand un valore di false, il pulsante verrà disabilitato. Quindi, qualunque sia il comando a cui è associato il tuo pulsante, vedi se puoi restituire CanExecute un valore di false quando vuoi disabilitarlo.

+0

+1 Risposta diretta. Non sono sicuro del motivo per cui questa risposta è in fondo. – rpattabi

1

questo funziona troppo:

Vista:

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

ViewModel:

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