У меня есть библиотека инструментов Silverlight 3 с настраиваемым пользовательским элементом управления DataGrid. Эта сетка не имеет прямого доступа к типам сущностей 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();
Какие-либо предложения?