将整个选定的DataGrid行模板设置为CellEditingTemplate

时间:2012-09-25 07:28:24

标签: wpf datagrid selected celltemplate celleditingtemplate

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

1 个答案:

答案 0 :(得分: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