2010-12-12 10 views
7

ListBox ve 3 Düğmeli bir DocumentListView.Xaml var.WPF/MVVM: UserControl'ün arkasındaki ViewModel henüz başlatılmamışsa, bir Button durumunu devre dışı bırakın.

Bu UserControl'ün arkasında 3 Düğmeli bir DocumentListViewModel ve bunların 3 RelayCommands'a bağlı Command Property özelliği vardır.

3Controller, BillingController, ReportController gibi 3 Denetleyicim var.

Her Denetleyici, Müşterinin 1: N Sipariş 1: N Belgesi gibi diğer Denetleyicileriyle birlikte Gözlemlenebilir Yapılandırmaları içerir.

Bir Denetleyicide özel bir bağlama durumum var. DocumentListViewModel, kendi ViewModel tarafından OrderViewModel gibi başlatılmadığında (hiçbir emir yüklenmemiş/var olmadığı için), UserControl'üm 3 düğmeli ETKİNLEŞTİRİLMİŞTİR. Tamam, kullanıcı 3 tuşa basabilir ve hiçbir şey olmuyor ama yine de çok kafa karıştırıcı ve her şeyden önce kullanıcı arayüzümde tutarlılık yok.

Düğme Komutu varsayılan olarak "Devre Dışı" olarak nasıl ayarlayabilirim?

Düğmelerin Ayarlanması IsEnabled özelliği false değerine neden olmaz çünkü düğme devre dışı durumda sonsuza kadar kalacaktır. Hiçbir CanExecute TRUE, bunu IsEnabled = true olarak ayarlayacaktır.

VEBir başka bir özellik tanıtmak istemiyorum IsButtonEnabled ... o aptalca çünkü ben her ikisi de benim düğmeleri mantığının arkasında winforms ve wpf dünyaları var ... ICommand yeterli olmalıdır.

cevap

17

Yoksa devre dışı bırakmak için düğme için bir Stil kullanabilirsiniz:

<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

Stiliniz ile IsEnabled özelliği TRUE olarak nasıl ayarlanır? – Elisabeth

+0

Tetik ne zaman tetiklenmezse - normal prosedür denir. Yani. Command-özelliği ayarlandığında ve CanExecute doğru olarak değerlendirildiğinde. – Goblin

+0

İşler! şimdi sayıyor! Teşekkürler Goblin. – Elisabeth

5

Bu ilginç bir durumdur. Dürüstçe, kullanıcı arabiriminin yüklü olduğu ve etkileşimli olduğu durumda hiçbir zaman karşılaşmadım, ancak ViewModel henüz bağlı değildi.

Ancak, bunu bir süreliğine göz ardı ederek, global olarak kullanılabilir bir NullCommand'a veya CanExecute yöntemi için her zaman false döndüren bir bağlamaya bağlanmak için bağlayıcınızda bir FallbackValue kullanabilirsiniz.

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

sorun benim DocumentListView bir UserControl 3 kez kullanılır. Komut Yaptığımda = "{Binding SaveCommand, FallbackValue = {x: Null}}" /> SaveButton hala Etkin. Ama ben Komuta ile devre dışı bırakmak istiyorum. – Elisabeth

+0

Doğru, örneğim, global olarak mevcut olan bir NullCommand'a dayanıyor, sizin belirttiğiniz gibi x: Boş değer değil, düğmeyi etkinleştirir. Her halükarda, Goblin'in geçici çözümünün uygulanması daha kolaydır. – Josh

+1

Bu özellikle Silverlight için son derece güzel bir çözümdür. –

İlgili konular