Как немедленно проверить вновь вставленную строку в сетке данных Silverlight 3? - PullRequest
3 голосов
/ 04 февраля 2010

У меня есть библиотека инструментов 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 ==
    }
}

Это работает, но мне нужно, чтобы оно также проверялось после добавления нового элемента. Есть два способа сделать это:

  1. Заставить пользователя войти в режим редактирования. для первой ячейки нового ряда в сетки. (Это заставит проверка, если они щелкают в любом месте еще на странице.)
  2. Подтверждение силы бежать сразу, когда новый ряд добавляется (или когда сетка теряет фокус.)

Я не смог заставить ни одного из них работать. Попробовал это, но он только выбирает строку, не заставляет запускаться проверки:

this._dataGrid.SelectedItem = newItem;
System.ComponentModel.IEditableObject editableItem = newItem as System.ComponentModel.IEditableObject;
if (editableItem != null)
    editableItem.BeginEdit();

Есть предложения?

1 Ответ

1 голос
/ 06 февраля 2010

Только что все заработало благодаря некоторой помощи от этого вопроса .

Я добавил следующее в раздел "== Проверка данных здесь ==" в приведенном выше коде:

DataGridRow newRow = this._dataGrid.ChildrenOfType<DataGridRow>().FirstOrDefault();
if (newRow != null)
{
    newRow.Loaded += (sender, e) =>
    {
        this._dataGrid.CurrentItem = newItem;
        this._dataGrid.BeginEdit();
    };
}

Это заставляет первую ячейку немедленно перейти в режим редактирования.

...