我有一个带有INotifyDataErrorInfo的MVVM应用程序,所有这些都已设置并正常运行。目前,我能够验证我的所有属性并阻止用户进行处理,直到处理完所有错误。一切都是阳光和玫瑰,直到最近我们意识到我们的一些控件(文本框和标签组合显示数字和单位类型,即100毫米)在删除值/退格时没有显示红色错误装饰器。
控件上有一个转换器,它接受一个double并将其格式化为一个字符串,以便在文本框中显示。我们在convertback方法中发现了一个问题,如果转换无法将字符串转换回double,它就会发送Binding.DoNothing。我们将其更改为DependencyProperty.UnsetValue,并认为一切都可以正常工作,但这发现了一个更大的问题。
我们现在遇到的问题是视频模型没有被通知转换器发生故障,我不知道该怎么做。当用户删除文本框内容时,将使用空字符串调用转换器。那个空字符串不会解析为double。
我觉得我需要一种方法来通知VM转换失败,因此它可以将属性标记为hasError。我认为没有办法做到这一点。这是转换方法的代码。
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
var strVal = value as string;
double dblVal = 0;
bool isSuccess = double.TryParse(strVal, out dblVal);
if (_systemUnits == SystemUnits.Metric && isSuccess)
{
return new[] { dblVal, Binding.DoNothing };
}
else if (_systemUnits != SystemUnits.Metric && isSuccess)
{
return new[] { Binding.DoNothing, dblVal };
}
else
{
return new[] { Binding.DoNothing, Binding.DoNothing };
}
}
}
我不确定其他代码是否相关,但如果您认为它会有所帮助,我愿意发布更多代码。谢谢你的时间!
答案 0 :(得分:0)
我觉得我需要一种通知虚拟机的方法
提供app类的静态关闭,该类具有相关VM的最新实例,并且在转换器访问中静态并直接从其调用方法/属性以通知状态。
<强> -Or - 强>
我建议您创建计算属性,这些属性与转换器执行相同的工作,以提供您提及的失败的估计值。
然后,您只需访问计算属性并执行您需要完成的过程。
这是一个示例属性IsOverLimit
,如果需要可以绑定,并通过其INotifyPropertyChange
等检查状态...
public bool IsOverLimit { get { return ThreadCreationLimit > 120 } }
public uint ThreadCreationLimit
{
get { return _ThreadCreationLimit; }
set
{
_ThreadCreationLimit = value;
OnPropertyChanged("ThreadCreationLimit");
OnPropertyChanged("IsOverLimit");
}
}