WPF验证和数据模板

时间:2010-08-16 10:31:08

标签: wpf binding

我正在寻找一种方法来验证包含选项卡且选项卡包含数据模板的表单上的所有数据。我一直在寻找并在这里找到一个类似的问题:http://www.netframeworkdev.com/windows-presentation-foundation-wpf/wpf-validation-data-templates-74176.shtml,但这没有得到一个好的答案。

走逻辑树检查所有控件似乎停在数据模板上 走视觉树不包括当前可见选项卡上没有的控件 使用IDataError不会捕获无效输入,例如绑定到数字的文本框中的字母。

对此有一个简单,干净的解决方案吗?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我认为问题的根源在于您的视图模型实际上并不是视图的模型。

视图模型中的每个属性都应该是适合视图的类型,而不是数据模型。如果数据模型中有数字属性,并且您在视图中使用文本框进行编辑,则视图模型中的属性应为字符串。

视图模型属性包含视图中出现的值,而不管这些值是否有效。视图中的值与视图模型中的值之间应该存在差异的唯一时间是当可编辑控件具有焦点时,用户正在更改其值,并且绑定未将新值推回到视图模特呢。

如果你这样做,我想你在这里表达的大部分担忧都会消失。填充视图模型对象后(假设您已在其setter中实现验证,并且您没有绕过其setter直接更新属性的支持字段),其属性是否有效,无论其视图是否有效已经实例化了。

在我的视图模型类中,我实现了一个名为Dictionary<string, string>的{​​{1}}属性。属性setter中的验证使用每个属性的验证错误填充Errors,如果属性有效则填充null。这使得实现Errors变得简单:

IDataErrorInfo.Item

我也可以实现这个属性:

public string this[string propertyName]
{
   get
   {
      return Errors.ContainsKey(propertyName) ? Errors[propertyName] : null;
   }
}

可以在我需要检查的任何地方使用,以确保视图模型的当前状态有效 - 例如,在public bool IsValid { get { return !(Errors.Values(x => x != null).Any()); } } 的{​​{1}}属性中。

答案 1 :(得分:0)

您是否考虑过使用IDataErrorInfo并使用适当的绑定来强制验证(请参阅hereherehere)?