C# WPF处理转换器错误和视图模型验证
我有一个MVVM应用程序,它的INotifyDataErrorInfo都已设置并运行。目前,我可以验证我的所有属性,并阻止用户继续操作,直到所有错误得到处理。直到最近,当我们意识到我们的一些控件(文本框和标签组合用于显示数字和单位类型,即100mm)在值被删除/退格时没有显示红色错误装饰符时,一切都是美好的 控件上有一个转换器,它接收一个double并将其格式化为字符串,以便在文本框中显示。我们在convertback方法中发现了一个问题,在该方法中,如果convertback无法将字符串转换回double,则会发送Binding.DoNothing。我们将其改为dependencProperty.UnsetValue,并认为一切都会正常工作,但这暴露了一个更大的问题 我们现在遇到的问题是,viewmodel没有收到转换器出现故障的通知,我不知道如何做到这一点。当用户删除文本框内容时,将使用空字符串调用转换器。这个空字符串不能解析为double 我觉得我需要一种方法来通知VM convertback失败,以便它可以将属性标记为hasError。不过,我看不出有什么办法可以做到这一点。下面是convertback方法的代码C# WPF处理转换器错误和视图模型验证,c#,wpf,validation,mvvm,converter,C#,Wpf,Validation,Mvvm,Converter,我有一个MVVM应用程序,它的INotifyDataErrorInfo都已设置并运行。目前,我可以验证我的所有属性,并阻止用户继续操作,直到所有错误得到处理。直到最近,当我们意识到我们的一些控件(文本框和标签组合用于显示数字和单位类型,即100mm)在值被删除/退格时没有显示红色错误装饰符时,一切都是美好的 控件上有一个转换器,它接收一个double并将其格式化为字符串,以便在文本框中显示。我们在convertback方法中发现了一个问题,在该方法中,如果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 };
}
}
}
我不确定还有哪些代码是相关的,但如果您认为有帮助的话,我愿意发布更多。谢谢你的时间
我觉得我需要一种方法来通知虚拟机
提供应用程序类的静态关闭,该应用程序类具有相关VM的最新实例,并且在转换器中访问该静态,并直接调用该静态的方法/属性以通知状态
-或-
我建议您创建与转换器工作相同的计算属性,以提供您提到的故障估计
然后,您就可以访问计算属性并执行需要完成的过程
下面是一个示例属性
IsOverLimit
,如果需要,可以对其进行绑定,并通过其INotifyPropertyChange
等检查状态
public bool IsOverLimit { get { return ThreadCreationLimit > 120 } }
public uint ThreadCreationLimit
{
get { return _ThreadCreationLimit; }
set
{
_ThreadCreationLimit = value;
OnPropertyChanged("ThreadCreationLimit");
OnPropertyChanged("IsOverLimit");
}
}
我建议将属性转换为输入的值的实际类型(是文本——是的,它是一个数字加上一个单位名称,但一起只是文本),并验证VM中的内容。又便宜又快。其他选项包括创建一个结合了数字和单位的特殊结构,定义了一个静态“无效”值(如double.NaN),并在用户输入无效时返回该值。更复杂,但它不会给你太多的震动。@Will这就是我害怕的。我遇到的几乎每一个可行的解决方案都围绕着将属性转换为字符串。这对我来说非常不方便,但现在似乎没有更多的选择了。