Как отображать объекты с динамическими полями в сетке данных wpf? - PullRequest
2 голосов
/ 25 марта 2010

Я хочу отображать и редактировать некоторые объекты в сетке данных WPF, и я ищу хороший способ сделать это. Все объекты, которые я хочу отобразить, имеют одинаковые поля, но при каждом выполнении поля моих объектов могут отличаться. Вот часть интерфейса, чтобы проиллюстрировать, что я имею в виду:

public interface IMyObject
{
    IEnumerable<string> GetFieldNames();
    IEnumerable<Type> GetFieldTypes();

    object GetField(string name);
    void SetField(string name, object value);
}

Как мне создать сетку данных, которая отображает объекты такого типа? Я думал о генерации XAML для определения столбцов, но все еще сталкиваюсь с проблемой доступа к полям. Я думаю, я мог бы реализовать это с помощью преобразователей значений, другой вариант - динамически создать тип, который предоставляет динамические поля со свойствами.

Есть ли другие способы, и которые я должен одобрить? Я хочу услышать ваше мнение.

С наилучшими пожеланиями,
Оливер Ханаппи

Ответы [ 2 ]

4 голосов
/ 25 марта 2010

Я бы сделал это с моим интерфейсом

public interface IMyObject
{
    IEnumerable<string> GetFieldNames();
    IEnumerable<Type> GetFieldTypes();

    //i would add this property, then you can bind directly to it.
    //basically it is a collection indexer, indexed by string
    object this[String name] { get; set; }

    object GetField(string name);
    void SetField(string name, object value);
}

Я бы построил столбцы в коде следующим образом (где stringKeyCollection представляет собой набор строк, возвращаемых из GetFieldNames () - хотя лично я бы держал эту информацию отдельно от моего объекта - как определение мастера)

foreach(String item in stringKeyCollection){
   //create the base column (use whatever column type you want
   DataGridBoundColumn column = new DataGridBoundColumn();
   //create the binding for the column
   column.Binding = new Binding("[" + item + "]");
   //set the header
   column.Header = item;
}

тогда у вас есть объекты в каждой ячейке сетки, и вы можете определять шаблоны по своему желанию.

0 голосов
/ 25 марта 2010

Тот факт, что тип связанных объектов меняется каждый раз, не очень важен, если ваша сетка установлена ​​на столбцы AutoGenerate, то она создаст столбцы для вас.Однако это может привести к довольно неприятным результатам.

Я хотел бы предложить следующее:

  • с вашими объектами данных, аннотируйте каждое отображаемое свойство пользовательским атрибутом, этопросто отметьте его для последующей проверки
  • как только вы получите свою коллекцию предметов, возьмите первый элемент в списке и передайте его фабричной функции, которая возвращает столбцы сетки
  • фабрику столбцов сеткиФункция может проверять объект данных с помощью отражения, ища свойства с помощью специального атрибута, который вы использовали ранее, и создавать соответствующий столбец сетки с соответствующим привязкой и преобразователем значений
  • , добавлять коллекцию столбцов сетки в сетку и связыватьданные

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

...