我发现了SL3的新数据注释功能,我正在使用它们进行用户输入验证。
我有这样的输入:
<dataInput:Label Target="{Binding ElementName=inputName}"/>
<TextBox
x:Name="inputName"
Text="{Binding RequestDemoData.Name, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}"/>
<dataInput:DescriptionViewer {Binding ElementName=inputName}"/>
我的模型看起来像这样:
[Display(ResourceType = typeof(Resources.Resources), Name = "Name", Description = "NameDescription")]
[Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "NameRequired")]
[RegularExpression(@"^[^0-9]*[a-zA-Z]+[^0-9]*$", ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "NameError")]
public string Name
{
get
{
ValidateProperty("Name", _name);
return _name;
}
set
{
if (_name != value)
{
ValidateProperty("Name", value);
_name = value;
OnPropertyChanged("Name");
}
}
}
到目前为止,这么好。如果用户输入了一些错误的数据,我会在他/她聚焦时收到错误消息。问题是我有一个绑定到ICommand
的提交按钮,我无法弄清楚当用户点击它时如何显示错误消息。
糟糕的方法是添加一些代码隐藏并执行GetBindingExpression(foo).UpdateSource()
,这样就可以解决问题。缺点是它完全无法管理,我讨厌在我的视图中使用代码隐藏。
http://www.thejoyofcode.com/Silverlight_Validation_and_MVVM_Part_II.aspx提出了一个解决方案,我将遵循它,但我想知道是否有更简单的方法。
干杯。
答案 0 :(得分:0)
不幸的是,没有更好的方法可以做到这一点。基于验证器进行UI更新的唯一方法是在绑定的setter中。
我认为,这是Silverlight中验证系统的一个巨大限制。 JoyOfCode文章真的是最好的方法。
我还建议你可以将错误绑定到viewmodel的article by the same publisher,但它不能反过来。
答案 1 :(得分:0)
我还在一个非常大规模的LOB应用程序中使用了Josh的方法,虽然它很麻烦但确实有效。特别是验证上下文可能会让你摆脱一些逻辑更复杂的碎片。