2010-12-12 16 views
7

Mam DocumentListView.Xaml z ListBox i 3 przyciski.WPF/MVVM: Wyłączyć stan przycisku, gdy ViewModel za UserControl nie jest jeszcze zainicjowany?

Za tym UserControl siedzi DocumentListViewModel 3 przyciski i ich mienia polecenia zmierzały do ​​3 RelayCommands.

Mam 3 kontrolery, takie jak AdministrationController, BillingController, ReportController.

każdy kontroler ma ObservableCollections jak Klienta 1: N Zakonu 1: N Dokumentu samym do innego sterownika.

W jednym kontrolerze mam szczególną sytuację wiążącą. Kiedy mój DocumentListViewModel nie jest zainicjalizowany przez jego rodzica ViewModel jak OrderViewModel (ponieważ żadne zamówienia nie są załadowane/istnieją) to moja UserControl ma 3 przyciski, które są WŁĄCZONE. Ok, użytkownik może nacisnąć 3 przyciski i nic się nie dzieje, ale nadal jest bardzo myląca, a przede wszystkim konsekwencja w interfejsie użytkownika zniknęła.

Jak ustawić domyślne polecenie przycisku jako "Wyłączone"?

Ustawienie właściwości IsEnabled na wartość false nie pomaga, ponieważ przycisk pozostanie na zawsze wyłączony. Nie CanExecute TRUE ustawi go na IsEnabled = true.

I nie chcę wprowadzać innej własności IsButtonEnabled ... to głupie, ponieważ wtedy mam zarówno winformy, jak i wpf za logiką moich przycisków ... ICommand powinno wystarczyć.

Odpowiedz

17

Albo można użyć stylu dla przycisku, aby wyłączyć:

<Style TargetType="{x:Type Button}" x:Key="DisablerButton"> 
    <Style.Triggers> 
     <Trigger Property="Command" Value="{x:Null}"> 
      <Setter Property="IsEnabled" Value="False" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
+0

W swoim stylu, w jaki sposób właściwość IsEnabled jest ustawiona na PRAWDA? – Elisabeth

+0

Gdy wyzwalacz nie jest trafiony - wywoływana jest normalna procedura. To znaczy. gdy właściwość Command jest ustawiona, a CanExecute ma wartość true. – Goblin

+0

Działa! to się teraz liczy! Dzięki, Goblin. – Elisabeth

5

To ciekawa sytuacja. Szczerze mówiąc, nigdy nie natknąłem się na przypadek, w którym interfejs był załadowany i interaktywny, ale ViewModel nie był jeszcze związany.

Jednak ignorując to przez chwilę, można potencjalnie użyć wartości FallbackValue na powiązaniu, aby powiązać z globalnie dostępną NullCommand lub coś, co zawsze zwraca wartość false dla metody CanExecute.

<Button Command="{Binding SaveCommand, FallbackValue={StaticResource NullCommand}}" /> 
+0

Problem jest mój DocumentListView jest UserControl stosowany 3 razy. Kiedy wykonuję polecenie = "{Binding SaveCommand, FallbackValue = {x: Null}}" /> przycisk SaveButton jest nadal włączony. Ale chciałbym wyłączyć to poprzez Commanding. – Elisabeth

+0

Dobrze, mój przykład opiera się na globalnie dostępnej wartości NullCommand, a nie na wartości x: Null, która, jak zauważyłeś, spowoduje włączenie przycisku. W każdym razie obejście Goblina jest prawdopodobnie łatwiejsze do wdrożenia. – Josh

+1

To jest bardzo ładne rozwiązanie, szczególnie dla Silverlight. –

Powiązane problemy