2010-08-13 21 views
16

Próbuję uzyskać uchwyt na WPF i MVVM i robię postępy. Strona WPF i MVVM rzeczy idą dobrze.Jak można "wyłączyć" przycisk w WPF przy użyciu wzorca MVVM?

Jednak XAML i dane wiążące strona jest zupełnie inna historia :)

Jak bym go o „wyłączenie” guzik?

Na przykład w moim modelu widoku mam właściwość CanClose, która określa, czy aplikacja może być obecnie zamknięta. Jeśli wątek roboczy jest wyłączony robienie czegoś, to ta właściwość jest ustawiona na false i chciałbym albo wyszarzyć przycisk lub jakoś wizualnie wyłączyć przycisk Zamknij poprzez jakieś wiążące.

Jak miałbym to zrobić?

Dzięki!

Edit -

Szkoda mogę przyjąć tylko jedną odpowiedź.

Te dwie odpowiedzi pomogły mi ogromnie. W poście Kenta, poszedł o krok dalej, wyjaśniając, dlaczego należy wdrożyć infrastrukturę polecenia w swojej aplikacji zamiast wyłączanie przycisku w sposób, który prosiłem:

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

A odpowiedź do mojego pierwotnego pytania :

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

Odpowiedz

28

Za pomocą wzoru polecenia. W modelu Widok:

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

w swojej XAML:

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

Czytaj this post, aby dowiedzieć się więcej o DelegateCommand.

+0

Ładny link, dzięki za informacje. Przeczytam całość tego popołudnia, kiedy dostanę trochę dodatkowego wolnego czasu. Biorę to DelegateCommand jest twoją własną implementacją wzorca poleceń, czy jest to coś w strukturze .net, której mi brakuje? –

+0

@IanP DelegateCommand jest częścią Prism, która wydaje się de facto obecnie pisać aplikacje WPF .... – BFree

+0

Hmm .. Nie wiedząc, co robi DelegateCommand, to nie pomoże mi tak bardzo, jak miałem nadzieję ... lol –

31

Wystarczy powiązać własność Buttona IsEnabled do CanClose:

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

nie ma mowy, jest to naprawdę takie proste? Nie mam pojęcia, jak mogłem to przeoczyć. Daj mi spróbować. –

+1

Dzięki, nie mogę uwierzyć, że przeoczyłem tak łatwą odpowiedź na problem. –

9

Jeśli zwrócisz CanExecute of ICommand o wartości false, przycisk zostanie wyłączony. Więc niezależnie od polecenia, do którego przycisk jest przypisany, sprawdź, czy możesz zwrócić wartość CanExecute wartości false, gdy chcesz ją wyłączyć.

+0

+1 Prosta odpowiedź. Nie wiem, dlaczego ta odpowiedź jest na dole. – rpattabi

1

To działa zbyt:

View:

 <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(); 
      } 
     } 
    } 
Powiązane problemy