EditItem не разрешен для этого представления - проблема привязки данных - PullRequest
4 голосов
/ 09 июня 2010

Я пытаюсь выполнить привязку данных в WPF к сетке данных с использованием списка вырезок.Мой пользовательский список содержит личный список данных типа List.Я не могу раскрыть этот список, однако индексаторы выставлены для просмотра и получения отдельных элементов.Мой пользовательский класс выглядит так:

public abstract class TestElementList<T> : IEnumerable
        where T : class
{
    protected List<T> Data { get; set; }
    public virtual T Get(int index)
    {
        T item = Data[index];
        return item;
    }

    public virtual void Set(int index, T item)
    {
         Data[index] = item;
    }
...
}

Данные связаны, но когда я пытаюсь их редактировать, я получаю «EditItem» не разрешен для этого представления ».Ошибка.Осуществляя расширенный поиск по сети, я обнаружил, что мне может понадобиться реализовать интерфейс IEditableCollectionView.Кто-нибудь может мне помочь, либо дать указания о том, как реализовать этот интерфейс, либо кто-нибудь предложить какой-либо другой лучший способ сделать привязку данных в пользовательском списке.

Ответы [ 3 ]

3 голосов
/ 25 февраля 2012

У меня было такое же исключение.Кажется, что вы должны связать сделать IList.Я был привязан к IEnumerable, и это исключение было сгенерировано.

3 голосов
/ 09 июня 2010

хотя я не полностью понимаю ваше требование, вы думаете, что использование ObservableCollection решит вашу проблему?

public abstract class TestElementList<T> : ObservableCollection<T>
    where T : class
 {
   public virtual T Get(int index)
   {
     T item = this[index];
     return item;
   }

   public virtual void Set(int index, T item)
   {
     this[index] = item;
   }
 ...
}
0 голосов
/ 19 июля 2011

Просто чтобы добавить мое собственное наблюдение.У меня была сетка данных со специально определенными столбцами в Xaml, а его ItemsSource был установлен в простой словарь.Когда я попытался отредактировать второй столбец, я получил это исключение, ссылаясь на словарь.Затем я устанавливаю сетку данных ItemsSource в список ключей (dataGrid.Keys.ToList ()).Я мог тогда отредактировать второй столбец.Кажется, что представление списка позволяет 'EditItem'.

edit : сделал немного больше копаться в этом.Я установил обработчик BeginningEdit и начал ковыряться.Одна вещь, которую я заметил, состояла в том, что каждый раз, когда я получал эту ошибку, EditingEventArgs.Source был границей.Если я найду время, я могу взглянуть на это немного дальше.Кроме того, в одном случае мое преобразование ключей словаря в список не сработало.Мне пришлось преобразовать его в коллекцию Observable, несмотря на то, что List был пригоден для всех других мест в моем коде, где я делал по существу идентичный тип назначения.

править снова Хорошо, у меня есть другое исправление для тех, для которых использование типа IList не работает.Присоедините обработчик BeginningEdit к вашей DataGrid и укажите на этот код:

    private void Grid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
    {
        //// Have to do this in the unusual case where the border of the cell gets selected
        //// and causes a crash 'EditItem is not allowed'
        e.Cancel = true;
    }

Это произойдет, только если вам каким-то образом удастся физически коснуться границы ячейки.OriginalSource события - это Border, и я думаю, что здесь происходит вместо TextBox или другого редактируемого элемента, являющегося источником, как и ожидалось, эта не редактируемая Border появляется для редактирования, что вызывает исключение, которое скрывается в 'EditItem не допускается, исключение.Отмена этого RoutedEvent до того, как он начнет пузыриться с его недопустимым исходным источником, прекратит возникновение ошибки в его дорожках.

Рад, что нашел это, так как в моем случае была DataGrid, на которой я не мог использовать тип IList.

...