2011-05-06 21 views
6

Bu yüzden MVVM uygulamasında çalışıyorum & Işlevine & parlaklıktan bir miktar koymaya başlıyorum. Benim sayfanın sol tarafında Silverlight MVVM - Butonu Görünürlük ve Görünürlük özellikleri

, ben bu değerleri gösteren ediyorum:

DateActivated 
DateCompleted 
DateTrialClosed 
DateAccountingClosed 

DB tarih varsa, bir TextBlock yayınlamaya ediyorum. Olmazsa, "İş Emrini Etkinleştir", "İş Emrini Tamamla" diyerek kullanıcıya bir düğme gösteriyorum, vb ...

Bu 8'in her birinin görünürlüğünü bağlayıcıyorum (4 textblock, 4 düğmesi),Windows.Visibility türünde benzersiz bir özelliğe denetler. SelectedWorkOrder ayarlayıcımdaki SelectedWorkOrder.DateActivated özelliğinin geçerli değerini değerlendiriyorum (örneğin) ve görünürlük özelliklerini buna göre ayarlayın. Bu benim için biraz ayrıntılı, ama beklendiği gibi çalışıyor.

Bir sonraki adım, ilk düğünden sonra görünen düğmelerin devre dışı bırakılmasıdır (mantık basittir ... 1 düğmesine tıklanana kadar 2 numaralı düğmeyi tıklatamaz. 1 & 2 numaralı düğüme kadar 3 numaralı düğmeyi tıklatamazsınız) tıkladım. Bunu yapmanın en iyi yolunun ne olduğundan emin değilim. Bu konuda bir FYI olarak, projemde zaten bir boolToVisibility değeri dönüştürücüsüne sahibim ... Bunu uygulamanın şu an yaptığımdan farklı olacağını emin değilim (aşağıdaki VM koduna bakın).

<TextBlock Text="Proposed:" /> 
<TextBlock Text="Activated:" /> 
<TextBlock Text="Eng Completed:" /> 
<TextBlock Text="Trial Close:" /> 
<TextBlock Text="Accounting Close:" /> 
<TextBlock Text="{Binding SelectedWorkOrder.EstimatedStartDate}" Visibility="{Binding ProposedVisibility}" /> 
<TextBlock Text="{Binding SelectedWorkOrder.DateActivated}" Visibility="{Binding ActivatedTextBlockVisibility}" /> 
<Button Content="Activate Work Order" Visibility="{Binding ActivatedButtonVisibility}" /> 
<TextBlock Text="{Binding SelectedWorkOrder.DateCompleted}" Visibility="{Binding EngineeringCompletedTextBlockVisibility}" /> 
<Button Content="Work Order Eng Complete" Visibility="{Binding EngineeringCompletedButtonVisibility}" /> 
<TextBlock Text="{Binding SelectedWorkOrder.DateClosed}" Visibility="{Binding TrialCloseTextBlockVisibility}" /> 
<Button Content="Close Work Order (Trial)" Visibility="{Binding TrialCloseButtonVisibility}" /> 
<TextBlock Text="{Binding SelectedWorkOrder.DateClosed}" Visibility="{Binding AccountingCloseTextBlockVisibility}" /> 
<Button Content="Close Work Order (Actual)" Visibility="{Binding AccountingCloseButtonVisibility}" /> 

VM Kodu:

Şu benim XAML için bu var

if (_SelectedWorkOrder.DateActivated.ToShortDateString() != "1/1/0001") 
{ 
    ActivatedTextBlockVisibility = Visibility.Visible; 
    ActivatedButtonVisibility = Visibility.Collapsed; 
} 
else 
{ 
    ActivatedTextBlockVisibility = Visibility.Collapsed; 
    ActivatedButtonVisibility = Visibility.Visible; 
} 

(Yeni DateTime eğer başlatmasını ediyorum olarak tarih benim veritabanı erişim katmanında 1/1/0001 olarak ayarlanır Is DBNull.Value = true)

+2

şiddetle kullanmanızı tavsiye [ 'DateTime.MinValue'] (http://msdn.microsoft.com/en-us/library/system.datetime.minvalue.aspx) DateActivated öğesini bir dizeye dökmek yerine "1/1/0001" ile karşılaştırmak yerine. –

cevap

2

Bu akşam benzer bir sorun yaşadım :-)

Bu tür şeyleri yapmanın en iyi yolunun, ViewModel'deki bir özelliğe görünürlük bağlaması olduğunu düşünüyorum.

Bu değişkenlerin her biri için bir dönüştürücü kullanabilirsiniz (böylelikle bir Visibility.Collapsed veya Visibility.Visible ;-) olduğunda döndürebilirsiniz).

Bu düğmelerin her biri için "CanExecute" yöntemini kullanabilirsiniz, böylece düğme 2 düğmesine basılana kadar (örneğin bir boole değişkeni ile) düğme 2 yürütülemez. Bunun için komutları kullanmaya hazır olursunuz, böylece her bir düğmeyle ilişkili kod ModelView'de olacaktır.

Örneklere ihtiyacınız varsa, bunları işimden Pazartesi gününe yapıştırabilirim :-).

Doğrudan burada kodlayarak küçük bir örnek (burada yüklü gümüş ışığı yok).

görünümünüz böyle olmalı:

<Button Content="Activate Work Order" Command="{Binding ActivateWorkOrderCommand}" /> 

Sen MVVM Komutları nasıl kullanılacağına ilişkin örnekler arama yapabilirsiniz, burada bir simple example var.dönüştürücüler için

, hala gizlemek ve düğmeler göstermeyi tercih ederseniz, IValueConverter uygulayan yeni bir sınıf beyan etmelidir:

public class UniversalConverter : IValueConverter { 
     public object Convert(object value, Type targetType, 
         object parameter, CultureInfo culture) { 
if(_SelectedWorkOrder.DateActivated.ToShortDateString() != "1/1/0001") 
{ 
      return Visibility.Collapsed; 
     } 
else { return Visibility.Visible; 
} 

Yani görünüm çok dönüştürücü bağlantı oluşturulmalıdır:

<Button Content="Activate Work Order" Visibility="{Binding DateActivated, Converter={StaticResource DateConverter}}" /> 

Yardım etmek istersiniz ;-)

+0

Evet örnekler harika olurdu. ViewModelBase'im zaten iCommand & iNotify (hangi arabirimin CanExecute olduğunu hatırlayamıyor) uyguluyor, bu yüzden zor olmamalı. Bu yöntemi hiç kullanmadığım için nasıl tetikleyeceğimi bilmiyorum. Teşekkürler dostum. –

+0

Bazı örnekler bulabilmek için biraz arayalım, gevşeme zamanı yaşıyorum: -P – zapico

+0

Teşekkür ederim. Komutları kullanmaya kesinlikle aşinayım ve zaten bir dönüştürücüm var. Sadece kodumdan daha az ayrıntılı olduğundan emin değilim, ancak kendi sınıfına soyutlamayı görebilmem de kod yeniden kullanımı için daha iyidir. –

1

Burada küçük bir örnek var.

Bir düğmeyi tıkladığınızda ve başka bir tıklattığınızda çıkış yaptığınızda bu basit bir örnek.

 #region Login Command 

     public ViewModelCommand LoginCommand { get; set; } 

     public void Login(object parameter) 
     { 
      Code.Session.Session.Sesion.Logged = true; 
     } 

     public bool CanLogin(object parameter) 
     { 
      return !Code.Session.Session.Sesion.Logged; 
     } 
     #endregion 



     #region Logout Command 

     public ViewModelCommand LogoutCommand { get; set; } 

     public void Logout(object parameter) 
     { 
      Code.Session.Session.Sesion.Logged = false; 
     } 

     public bool CanLogout(object parameter) 
     { 
      return Code.Session.Session.Sesion.Logged; 
     } 
     #endregion 

, görünürlük ve diğer verileri bağlamak bir mal beyanında için::

Bunlar

komutlardır

kamu const dizesini SesionPropertyName = "Sesion"; Bu örnekte

private Model.Sesion _Sesion = Code.Session.Session.Sesion; 

public Model.Sesion Sesion 
{ 
    get 
    { 
     return _Sesion; 
    } 

    set 
    { 
     if (_Sesion == value) 
     { 
      return; 
     } 

     var oldValue = _Sesion; 
     _Sesion = value; 

     // Update bindings, no broadcast 
     RaisePropertyChanged(SesionPropertyName); 
    } 
} 

, biz kullanıcı giriş yaptığında düğmesini gizlemek ve kullanıcı tersi geçerli olduğunda göstermek gerekir, bu yüzden bu dönüştürücü yaptı: Nihayet

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if ((bool)value) 
      { 
       return Visibility.Collapsed; 
      } 
      else 
      { 
       return Visibility.Visible; 
      } 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if ((Visibility)value == Visibility.Visible) 
      { 
       return false; 
      } 
      else 
      { 
       return true; 
      } 
     } 

, biz onu bağlamak zorunda görüntülemek dönüştürücü dikkat edin:

<Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="221*" /> 
       <ColumnDefinition Width="140*" /> 
      </Grid.ColumnDefinitions> 
      <Button Content="Logout" Grid.Column="1" HorizontalAlignment="Stretch" Margin="2" Name="bLogout" VerticalAlignment="Stretch" Command="{Binding LogoutCommand}" /> 
      <TextBlock Height="Auto" HorizontalAlignment="Stretch" Margin="2" Name="txtBlockUser" Text="{Binding Sesion.UserName}" VerticalAlignment="Center" TextWrapping="NoWrap" TextAlignment="Center" /> 
      <Grid Grid.ColumnSpan="2" > 
        <Button Content="Login" Command="{Binding LoginCommand}" Visibility="{Binding Sesion.Logged, Converter={StaticResource InverseBooleanVisibilityConverter}}"></Button> 
      </Grid> 
     </Grid> 
+0

Yani şimdiye kadar bu kadar var - bilmiyorum ne engelliler/etkin özellik hakkında ne yapmalıyım. –

+0

Düğmeleriniz varsa, kural dışı yöntem nedeniyle etkinleştirilecek/devre dışı bırakılacak. Değiştirebileceğinizi düşündüğünüzde (örneğin, özellikler kümesinde) OnCanExecuted yöntemini çağırmalısınız: this.LoginCommand.OnCanExecuteChanged(); – zapico

İlgili konular