我有一个带有 INotifyDataErrorInfo 的 MVVM 应用程序,所有这些都已设置并正常运行。目前,我能够验证我的所有属性并阻止用户继续操作,直到所有错误都得到处理。一切都是阳光和玫瑰,直到最近我们意识到我们的一些控件(文本框和标签组合用于显示数字和单位类型,即 100mm)在删除/退格时没有显示红色错误装饰器。
控件上有一个转换器,它接收一个 double 值并将其格式化为一个字符串以显示在文本框中。我们在 convertback 方法中发现了一个问题,如果 convertback 未能将字符串转换回 double 值,它会发送 Binding.DoNothing。我们将其更改为 DependencyProperty.UnsetValue 并认为一切正常,但这发现了一个更大的问题。
我们现在遇到的问题是,viewmodel 没有收到转换器失败的通知,我不知道该怎么做。当用户删除文本框内容时,将使用空字符串调用转换器。该空字符串不会解析为 double 字符串。
我觉得我需要一种方法来通知 VM 转换失败,以便它可以将属性标记为 hasError。我看不出有什么办法可以做到这一点。这是 convertback 方法的代码。
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 };
}
}
}
我不确定其他哪些代码是相关的,但如果您认为有帮助,我愿意发布更多代码。谢谢你的时间!
最佳答案
I feel like I need a way to inform the VM
提供应用程序类的静态关闭,它具有相关 VM 的最新实例,并在转换器中访问该静态并直接调用它的方法/属性以通知状态。
-或者-
我建议您创建计算 属性,它与转换器的工作相同,以提供您提到的故障的估计值。
然后您就可以访问计算属性并执行您需要完成的过程。
这是一个示例属性 IsOverLimit
,如果需要可以绑定(bind)它并通过其 INotifyPropertyChange
等检查状态...
public bool IsOverLimit { get { return ThreadCreationLimit > 120 } }
public uint ThreadCreationLimit
{
get { return _ThreadCreationLimit; }
set
{
_ThreadCreationLimit = value;
OnPropertyChanged("ThreadCreationLimit");
OnPropertyChanged("IsOverLimit");
}
}
关于c# - WPF 处理转换器错误和 View 模型验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43008092/