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