Обвязка многофункциональная WPF DataGrid - PullRequest
4 голосов
/ 21 октября 2010

Как вы будете связывать сетку данных WPF, которая должна отображать данные из разных источников данных с различным количеством столбцов с разными заголовками и типами столбцов?

В настоящее время я создаю пользовательский List<DataGridColumn>() список столбцов сетки данных в моей ViewModel для каждой отдельной коллекции записей, которые будут отображаться в этой DataGrid.

Я перебираю этот список для установки столбцов DataGrid:

foreach (DataGridColumn dgc in dgcSample)
{
  dgc.HeaderStyle = hStyle;
  dgMyDataGrid.Columns.Add(dgc);
}

Наконец,Я использую ItemsSource для установки источника элементов:

dgMyDataGrid.ItemsSource = SomeCollection;

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

Есть мысли?

Ответы [ 3 ]

2 голосов
/ 29 октября 2010

Я думаю, вам нужно связать свой DataGrid с одним источником данных, но ваша задача - просто создать этот источник данных.

Я создам образец для создания источника данных из различных объектов, используя LINQ ..

Предполагается, что у вас есть две разные сущности: Entity1 и Entity2, и у каждой из них есть общий идентификатор:

class Entity1
{
    public int ID { get; set; }
    public string E1Column { get; set; }
}

class Entity2
{
    public int ID { get; set; }
    public string E2Column { get; set; }
}

Вы можете создать источник данных, используя Join в LINQ, как показано ниже:

List<Entity1> e1List = new List<Entity1>();
e1List.Add(new Entity1() { ID = 1, E1Column = "E1 a" });
e1List.Add(new Entity1() { ID = 2, E1Column = "E1 b" });

List<Entity2> e2List = new List<Entity2>();
e2List.Add(new Entity2() { ID = 1, E2Column = "E2 a" });
e2List.Add(new Entity2() { ID = 2, E2Column = "E2 b" });

var query = from e1 in e1List
            join e2 in e2List on e1.ID equals e2.ID
            select new { ID = e1.ID, E1Column = e1.E1Column, E2Column = e2.E2Column };

// Bind the DataGrid
dataGrid1.ItemsSource = query.ToList();

Удачи!

1 голос
/ 01 ноября 2010

Рассматривали ли вы использование производного класса сетки данных, показанного в http://www.codeproject.com/KB/grid/MultiColumnSetDataGrid.aspx

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

1 голос
/ 30 октября 2010

IMO правильный способ сделать это состоит в том, чтобы заключить все источники данных в один объект, который похож на ваш пользовательский List<DataGridColumn>(). Назовите это MultifunctionalSource.

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

MultifunctionalSource отвечает за предоставление привязываемого источника данных.

Модель будет предоставлять объекты типа MultifunctionalSource для просмотра.

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

MultifunctionalSource, вероятно, должен возвращать список столбцов, которые он считает актуальными для отображения. Он также должен иметь возможность возвращать полный список столбцов, чтобы пользовательский интерфейс мог решать, какие столбцы актуальны на основе других критериев; таким образом сохраняя границы.

...