我有CheckBox和两个TimePicker控件。我希望在TimePicker2-TimePicker1>的差异时启用复选框。 0.否则禁用它。
我可以在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}"
/>
答案 0 :(得分:2)
在ViewModel中,创建一个仅以getter为单位的属性,该属性以与UI无关的方式表示日期的有效性。像bool AreTimesValid
一样。在此属性的getter中,评估开始时间和结束时间之间的差异,并相应地返回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;
}
将CheckBox
IsEnabled
媒体资源绑定到AreTimesValid
字段。
<CheckBox Grid.Row="4"
HorizontalAlignment="Left" VerticalAlignment="Center"
Margin="8,0,0,0"
IsEnabled="{Binding ElementName=ViewModel.AreTimesValid}"/>
另一种方法是使用实现IMultiValueConverter
的转换器,并将比较逻辑放在那里。然后你可以直接绑定。但在我看来,第一种解决方案更简单,更清晰。