我有一个timespan textbox,我的objectif是在timespan的形式错误时禁用按钮保存(EXP 90:00:00)..
我尝试一个代码,它仅一次是正确的。如果我设置20:10:00 ..启用了保存按钮(正确)。在那之后,timespan是错误的55:00:00,启用了按钮(数据库中的节省为00:00:00)
XAML:
<TextBox Name="txtTime" Margin="10,10,10,10" >
<TextBox.Text >
<Binding Path="Time" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True" Mode="TwoWay" >
<Binding.ValidationRules>
<local:DateTimeValidationRule ValidationStep="RawProposedValue"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
ViewModel:
public bool VarTIME ;
[Required(ErrorMessage = "Time is required")]
public TimeSpan Time
{
get { return time; }
set
{
time = value;
intervalString = Time.ToString();
TimeSpan reded;
bool success = TimeSpan.TryParseExact(intervalString, "hh\:mm\:ss",
CultureInfo.InvariantCulture, out reded);
if (success)
{
VarTIME = true;
}
OnPropertyChanged("Time");
}
}
public SheduleTrainViewModel()
{
VarTIME = false;
addTrain = new RelayCommand<string>(AddTrainFunction, canAddTrain);
private bool canAddTrain(string obj)
{ return VarTIME;
}
}
VelidationResult类:
public class DateTimeValidationRule: ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
string time;
Regex regex;
if (value == null)
return new ValidationResult(true, null);
else
time = value.ToString();
regex = new Regex(@"^([0-1]?d|2[0-3])(?::([0-5]?d))?(?::([0-5]?d))?$");
if (regex.IsMatch(time.ToString()))
return new ValidationResult(true, null);
return new ValidationResult(false, "The time must match this format hh:mm:ss / hh:mm");
}
}
我如何将其修复以使其工作始终正确?谢谢,
您无法将TimeSpan
属性设置为有效的TimeSpan
值以外的任何内容,因此在源属性的设置中进行验证是毫无意义的。
value
is 始终有效的时间pan。
您应该在ValidationRule
中执行验证:
public class DateTimeValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
TimeSpan reded;
if(!TimeSpan.TryParseExact(value.ToString(), "hh\:mm\:ss", CultureInfo.InvariantCulture, out reded))
return new ValidationResult(false, "Invalid time!");
return ValidationResult.ValidResult;
}
}
此验证失败,TextBox
将获得一个红色边框(使用默认验证。ERRORTEMPLATE),该边框表明该值无法转换为TimeSpan
,并且不会设置属性。