2016-06-17 22 views
0

Ich habe CheckBox und zwei TimePicker-Steuerelemente. Ich möchte Kontrollkästchen aktivieren, wenn der Unterschied von TimePicker2-TimePicker1> 0 ist. Und deaktivieren Sie es andernfalls.Kontrollkästchen mit Bedingungen deaktivieren

Kann ich es in XAML machen?

Hier den Code:

<xctk:TimePicker Grid.Row="1" Grid.Column="0" Height="22" HorizontalAlignment="Stretch" 
           Format="ShortTime" Margin="8,0,0,0" 
           Value="{Binding ViewModel.StartTime,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
           ></xctk:TimePicker> 

<xctk:TimePicker Grid.Row="3" Grid.Column="0" Height="22" HorizontalAlignment="Stretch" 
           Format="ShortTime" Margin="8,0,0,0" 
           Value="{Binding ViewModel.EndTime,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
           ></xctk:TimePicker> 
<CheckBox Grid.Row="4" 
         HorizontalAlignment="Left" VerticalAlignment="Center" 
         Margin="8,0,0,0" 
        ??? IsEnabled="{Binding ElementName=}" 
         IsChecked="{Binding ViewModel.Date,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
         /> 

Antwort

2

In Ihrem Ansichtsmodell, erstellen Sie eine Getter geschützte Eigenschaft, die die Gültigkeit der Daten in einer UI-unabhängigen Art und Weise darstellt. Wie bool AreTimesValid. Bewerten Sie im Getter für diese Eigenschaft die Differenz zwischen den Start- und Endzeiten und geben Sie true oder false entsprechend zurück.

Erhöhen Sie eine Eigenschaft geändert Benachrichtigung für die AreTimesValid Eigenschaft jedes Mal die StartTime und EndTime Eigenschaften ändern.

class YourViewModel : INotifyPropertyChanged 
{ 
    public bool AreTimesValid 
    { 
     get 
     { 
      return StartTime < EndTime; 
     } 
    } 

    public DateTime StartTime 
    { 
     get 
     { 
      return startTime; 
     } 

     set 
     { 
      startTime = value; 
      NotifyPropertyChanged("StartTime"); 
      NotifyPropertyChanged("AreTimesValid"); 
     } 
    } 

    private DateTime startTime; 

    public DateTime EndTime 
    { 
     get 
     { 
      return endTime; 
     } 

     set 
     { 
      endTime = value; 
      NotifyPropertyChanged("EndTime"); 
      NotifyPropertyChanged("AreTimesValid"); 
     } 
    } 

    private DateTime startTime; 
} 

Binden Sie Ihre CheckBoxIsEnabled Eigenschaft auf ths AreTimesValid Feld.

<CheckBox Grid.Row="4" 
    HorizontalAlignment="Left" VerticalAlignment="Center" 
    Margin="8,0,0,0" 
    IsEnabled="{Binding ElementName=ViewModel.AreTimesValid}"/> 

Die Alternative ist es, einen Konverter zu verwenden IMultiValueConverter Implementierung und setzen die Vergleichslogik drin. Dann können Sie direkt binden. Aber die erste Lösung ist meiner Meinung nach einfacher und klarer.

Verwandte Themen