我有一个带有自定义DataGrid用户控件的Silverlight 3工具库。该网格无法直接访问WCF RIA Services实体类型,因此当用户在网格为空时单击该网格时,我使用反射来添加新项目:
private void InsertEmptyRecord()
{
if (this._dataGrid.ItemsSource == null)
return;
Type[] typeParameters = this._dataGrid.ItemsSource.GetType().GetGenericArguments();
if (typeParameters.Count() > 0)
{
Type itemType = typeParameters[0];
object newItem = System.Activator.CreateInstance(itemType);
Type sourceType = typeof(System.Windows.Ria.EntityCollection<>);
Type genericType = sourceType.MakeGenericType(itemType);
System.Reflection.MethodInfo addMethod = genericType.GetMethod("Add");
addMethod.Invoke(this._dataGrid.ItemsSource, new object[] { newItem });
// == Validate data here ==
}
}
这可行,但是添加新项后我还需要它进行验证。我可以通过两种方式查看此操作:
强制用户进入编辑模式
在新行的第一个单元格中
网格。 (这将迫使
验证他们是否单击任何地方
页面上的其他)。
强制验证
当新行立即运行
已添加(或当网格松动时
焦点。)
我还没有办法使它们都起作用。尝试过此操作,但仅选择该行,不强制运行验证:
this._dataGrid.SelectedItem = newItem;
System.ComponentModel.IEditableObject editableItem = newItem as System.ComponentModel.IEditableObject;
if (editableItem != null)
editableItem.BeginEdit();
有什么建议?
最佳答案
在this question的帮助下,这项工作才得以完成。
我从上面的代码中将以下内容添加到“ == Validate data here ==”部分中:
DataGridRow newRow = this._dataGrid.ChildrenOfType<DataGridRow>().FirstOrDefault();
if (newRow != null)
{
newRow.Loaded += (sender, e) =>
{
this._dataGrid.CurrentItem = newItem;
this._dataGrid.BeginEdit();
};
}
这将强制第一个单元格立即进入编辑模式。
关于reflection - 如何立即验证Silverlight 3 Datagrid中新插入的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2195938/