使用CellTemplate和CellEditingTemplate在DataGrid中进行IDataErrorInfo验证

时间:2012-09-24 10:55:44

标签: wpf validation datagrid idataerrorinfo celleditingtemplate

我在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

1 个答案:

答案 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