0

我有一个关于 WPF DataGrid 的问题。为了 IDataErrorInfo 验证,我想将整个选定的行设置为编辑 - 我的意思是将每个单元格(在该行中)的数据模板从 CellTemplate 设置为 CellEditingTemplate。

例如,这是一列:

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

这在 XAML 中是否可行(某种触发器)?我将如何在代码隐藏中做到这一点?我找到了具有两种不同样式作为资源的解决方案,然后在 Row_Selected 和 Row_Unselected 事件中以编程方式在它们之间切换,但我宁愿将现有的上述 XAML 代码用于列(具有单独的 CellTemplate 和 CellEditingTemplate)。

谁能指出我正确的方法?

提前致谢。最好的问候, DB

4

1 回答 1

0

好的,我没有设法将整行置于编辑模式,但我设法重新验证 IDataErrorInfo 对象 - 有点强制 IDataErrorInfo 验证。这就是我想在行的所有单元格上设置编辑模式的原因 - 将 CellEditingTemplate 中的控件绑定到具有 ValidateOnDataErrors = True 的对象属性。否则,我将新对象添加到 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

于 2012-10-17T06:37:10.813 回答