我在DataGrid中遇到验证问题。我在模型类中使用IDataErrorInfo验证。
问题在于可编辑的DataGrid,带有单独的CellTemplate和CellEditingTemplate(注意是一个非null属性 - 验证返回Error,如果为null或为空):
<!-- some other validated columns -->
<DataGridTemplateColumn Header="Note">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Name="textBoxNote" Text="{Binding Note, ValidatesOnDataErrors=True}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Note}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
在“保存”按钮上,我检查MyObject.Error验证属性,如果不是null,则显示MessageBox。问题是当将第一列(而不是Note 1)更改为有效值然后单击Save按钮时,.Error属性为null - 这是预期的(尽管是不需要的)行为,因为与Note属性上的ValidatesOnDataError的绑定从未发生过(TextBox控件从未存在!)。但是,如果我在TextBlock上将ValidatesOnDataErrors设置为true,那么我会对DataGrid中显示的每个对象(比如来自数据库)得到不需要的验证,我并不关心;在这种情况下,验证也可能需要花费很多时间......
处理此问题的正确方法是什么?我想在模型类中保持验证(对象应该知道它是否有效)。有没有办法强制验证代码隐藏中的行绑定对象(保存按钮事件)?或者我应该以某种方式初始化.Error对象构造?还有其他想法吗?
修改 怎么能把整行(所有单元格)都放到编辑模式(CellEditingTemplate)?然后,所有控件都将被加载和数据绑定,这也意味着验证...
感谢所有人, DB
答案 0 :(得分:0)
好的,我设法重新验证了IDataErrorInfo对象 - 一种强制的IDataErrorInfo验证。否则我可以将新对象添加到DataGrid,但属性(已编辑的属性除外)从未得到验证。
在我所有模型对象的超类中(扩展了IDataErrorInfo),我添加了这个方法:
public virtual void Revalidate() // never needed to override though
{
Type type = this.GetType();
// "touch" all of the properties of the object - this calls the indexer that checks
// if property is valid and sets the object's Error property
foreach (PropertyInfo propertyInfo in type.GetProperties())
{
var indexerProperty = this[propertyInfo.Name];
}
}
现在,当用户向DataGrid添加新对象时,我手动调用myNewObject.Revalidate()方法来设置我在将对象保存到数据库之前检查的Error属性。也许这不是最好的解决方案,但它对我来说非常轻松。
谢谢和问候, DB