2014-12-15 5 views
0

Я пытаюсь сделать что-то довольно простое, и получать разочарованы .Net:Перекрытие ObservableCollection <T> - Легкий способ

Я просто хочу, чтобы иметь DataGrid WPF, который автоматически добавляет пустую строку в конце, аналогично для ввода данных в таблицу в MS Access или SQL Management Studio.

Моей идеей было переопределить ObservableCollection: сохранить член newItem, который я динамически добавляю при чтении коллекции Items. Что-то вроде этого:

// Warning this code doesn't work 
public class MyCollection<T> : ObservableCollection<T> 
{ 
    private T _newItem; 

    // there would be a constructor which would initialize _newItem 

    protected override IList<T> Items 
    { 
     get 
      { 

       List<T> newItems = new List<T>(); 
       newItems.Add(_newItem); 
       return base.Items.Union(newItems).ToList(); 
      } 
    } 
} 

Есть несколько проблем с моим кодом. Во-первых, вы не можете переопределить getter свойства Items. Это не сложно.

Во-вторых, даже если бы вы могли, этот геттер даже не вызывается, когда DataGrid привязан к коллекции. Я думаю, что метод GetEnumerator должен быть переопределен здесь, но, конечно, это тоже не переопределяемо.

Что является самым простым способом расширить класс ObservableCollection для реализации этой функции. На данный момент это похоже на то, что я должен сам реализовать все это, а не наследовать от ObservableCollection. По очевидным причинам я устойчив к этой идее.

Заранее благодарен!

+0

Возможно, пойдите со стороны DataGrid. – Paparazzi

+2

Для этого DataGrid имеет [встроенную функцию] (http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.canuseraddrows.aspx). –

+0

Если вы используете mvvm, ваша модель просмотра всегда может добавлять пустой элемент в коллекцию, когда захотите. не нужно ничего переоценивать – blindmeis

ответ

1

Насколько я знаю, DataGrid делает дисплей пустой строки в нижней части, если вы установите CanUserAddRows Истинных и обеспечить ваш класс DTO имеет конструктор по умолчанию. Разве это не работает в вашем случае?

В любом случае, вы пытаетесь решить проблему с пользовательским интерфейсом, изменяя свой источник данных, поэтому неудивительно, что вы столкнулись с проблемами. Это явное указание, что это не путь.

+0

Я знаком с этой особенностью DataGrid, однако, я не люблю UX. На самом деле пытается дублировать опыт Access или SQL Management Studio при редактировании данных таблицы. – FunkMonkey33

+0

Все эти вопросы относятся к пользовательскому интерфейсу, который вы должны решить в своем представлении или в UserControl, а не за данными. По-видимому, актуальным вопросом является не то, как отображать новую строку вообще, но как создать другой пользовательский интерфейс, сохраняя простое привязку данных. Например. вы можете добавить однострочный datagrid прямо под основной сеткой, привязать его к одному объекту и обработать перенос новой строки в основную * коллекцию * в вашем коде. Рассмотрите возможность использования другой сетки, которая уже предоставляет эту функциональность. Хорошая сетка, вероятно, стоит * много * меньше зарплаты программиста в течение одной недели и делает намного больше –

+0

В общем, я согласен с вами. Однако что такое ObservableCollection, если не специализированный контейнер для отображения данных в элементе управления List List? Представляется логичным следующий шаг, чтобы расширить его, чтобы создать несколько более специализированный контейнер. – FunkMonkey33

Смежные вопросы