2016-06-17 2 views
0

У меня есть CheckBox и два элемента управления TimePicker. Я хочу установить флажок, если разница TimePicker2-TimePicker1> 0. И отключить его в противном случае.Отключить CheckBox с условиями

Могу ли я сделать это в XAML?

Вот код:

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

ответ

2

В вашей ViewModel, создать свойство геттер только что представляет действительность дат в UI-независимым способом. Мне нравится bool AreTimesValid. В геттере для этого свойства оцените разницу между начальным и конечным временем и верните true или false соответственно.

Приобретите измененное уведомление о недвижимости для AreTimesValid недвижимости каждый раз, когда StartTime и EndTime изменить свойства.

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

связав свою недвижимость CheckBoxIsEnabled в тыс AreTimesValid поле.

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

В качестве альтернативы можно использовать преобразователь, реализующий IMultiValueConverter, и поставить логику сравнения там. Затем вы можете напрямую связываться. Но, на мой взгляд, первое решение проще и понятнее.

Смежные вопросы