Привязка столбцов сетки данных к модели представления - PullRequest
0 голосов
/ 30 апреля 2019

У меня отлично работает модель представления, которая в основном имеет следующие свойства:

    -ItemCollection
       - Name
       - Type
       - DayCollection
           - DateOfDay
           - Value

Я сейчас пытаюсь заставить представление работать, чтобы представить данные следующим образом:

Name | Type  | DateOfDay1 | DateOfDay2 | DateOfDay3 ...
Dave | Actual| 1.2        | 1.8        | 5.4
Mary | Actual| 3.4        | 2.3        | 6.4
...

Проблема в том, что когда я связал ItemCollection с Datagrid в представлении, представление отображает:

Name | Type  | DayCollection
Dave | Actual| (Collection)
Mary | Actual| (Collection)

Важно - в отличие от некоторых примеров ниже, мой вариант использования более прост - всеэлементы в ItemCollection всегда будут иметь одинаковое количество дней в DayCollection - т.е. все строки моей таблицы будут иметь одинаковое количество столбцов.Хотя обратите внимание, что разные ItemCollections могут иметь разное количество дней (но в пределах ItemCollection все Item будут иметь одинаковое количество дней), поэтому я не могу просто сгладить модель представления выше и иметь ItemCollection, например:

-ItemCollection
    - Name
    - Type
    - Day1
    - Day2
    - Day3

, поскольку одна ItemCollection (таблица) может иметь 5 дней и 30 дней.

Я обнаружил следующие статьи, в которых говорится о динамическом добавлении столбцов - мне не нужно добавлять или удалять столбцы во время моегоedit - количество столбцов фиксировано:

https://www.codeproject.com/Articles/899637/Dynamic-Columns-in-a-WPF-DataGrid-Control-Part

http://www.unixresources.net/faq/320089.shtml

https://www.codeproject.com/Tips/676530/How-to-Add-Columns-to-a-DataGri

Я обнаружил, что вышеупомянутые образцы слишком сложны длячто-то, что я думал, было удивительно простым вариантом использования - переменное количество элементов (строк), но фиксированное (заранее определенное) количество столбцов в каждой строке [хотя последняя из вышеприведенных статей написана очень хорошо].Я надеялся, что смогу просто определить столбцы, используя повторяющийся xaml, например:

<DataGrid ...>
    <DataGrid.Columns>
         <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
         <DataGridTextColumn Header="Type" Binding="{Binding Type}" />    
         <Repeater ItemsSource="{Binding DayCollection}">
             <DataGridTextColumn Header="{Binding DateOfDay}" Binding="{Binding Value}" />
         </Repeater>
    </DataGrid.Columns>
</DataGrid>

Что-то вроде вышеизложенного будет простым решением простого сценария использования, но, очевидно, не поддерживается

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

Единственная другая мысль, которая у меня была, былау меня есть свойство, такое как ToDataTable () в моей модели представления, которое будет выводить таблицу данных из моей модели представления, которая содержит полные строки и столбцы, с которыми я могу связать сетку данных, но опять же это кажется пустой тратой - и тогда это станет намного сложнеепроверить наличие обновлений и направить их в бизнес-логику ужеy присутствует в вышеупомянутой рабочей модели представления.

Есть ли простое решение, или я потратил много кода для простого варианта использования?

Ответы [ 2 ]

3 голосов
/ 01 мая 2019

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

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

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

<DataGrid ItemsSource="{Binding MyTable}" />

...

public class MainViewModel : ViewModelBase
{
    public DataTable MyTable { get; } = new DataTable();
    private int NumColumns = 3;

    public MainViewModel()
    {
        this.MyTable = new DataTable();
        this.MyTable.Columns.Add("Name");
        this.MyTable.Columns.Add("Type");
        for (int i = 1; i <= NumColumns; i++)
            this.MyTable.Columns.Add($"Day {i}");

        var row = this.MyTable.NewRow();
        row.ItemArray = new object[] { "Tom", "Type A", "1.2", "2.3", "3.4" };
        this.MyTable.Rows.Add(row);

        row = this.MyTable.NewRow();
        row.ItemArray = new object[] { "Dick", "Type B", "2.3", "3.4", "4.5" };
        this.MyTable.Rows.Add(row);

        row = this.MyTable.NewRow();
        row.ItemArray = new object[] { "Harry", "Type C", "3.4", "4.5", "5.6" };
        this.MyTable.Rows.Add(row);
    }
}

enter image description here

0 голосов
/ 06 мая 2019

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

https://www.codeproject.com/Tips/676530/How-to-Add-Columns-to-a-DataGri

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...