Как я могу создать Grid с осями X и Y, привязанными к разным коллекциям? - PullRequest
1 голос
/ 15 сентября 2011

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

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

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

Task Scheduler Sketch

Редактировать

Моя база данных выглядит так:

ТАБЛИЦА ЗАДАЧ

TaskId
CategoryId
OtherProperties

ТАБЛИЦА ИНСТАНЦИИ ЗАДАЧИ

TaskInstanceId
ParentTaskId
DueDate

У меня есть хранимая процедура, которая принимает диапазон дат и возвращает список следующего класса (необходимо вычислить повторяющиеся события)

TaskInstanceId
ParentTaskId
Name
Category
DueDate
OtherProperties

Я пытался сделать это с третьим классом, который содержит

Date
List<Task>

Ответы [ 3 ]

1 голос
/ 16 сентября 2011

Я думаю, я мог бы найти способ сделать это ... Мне нужно немного изменить свои данные

  • Моя основная ViewModel будет содержать ObservableCollection<DateTime> CurrentWeek и ObservableCollection<Category> CurrentTasks

  • Класс Category должен иметь ObservableCollection<Task> Tasks

  • А Task должен иметь ObservableCollection<TaskInstances> Occurences

Основная ViewModel также должна подписаться на CurrentWeek.CollectionChanged, и в зависимости от того, какие даты в коллекции, обновлять каждый Category.Task[x].Occurences, если Category.Task.IsRecurring == true

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

Обновление: Работает:)

Sample Layout

0 голосов
/ 16 сентября 2011

Учитывая, что мы говорим о WPF, я предполагаю, что Viewed Week, Categories и Tasks являются объектами модели.В этом случае я хотел бы создать ModelView, который объединяет эти объекты на основе логических отношений вашего приложения в объект Week другого ModelView, свойства которого в конечном итоге привязываются к реальному пользовательскому интерфейсу (Grid, ListView, элемент управления Telerik и т. Д...).

0 голосов
/ 15 сентября 2011

Я бы, вероятно, воспользовался свойством DataTable, которое вы перестраивали при смене недели, а затем связывал бы DataGrid с этим DataTable.

Код перестроения будет выглядеть примерно так (очевидно, потребуется подстройка в зависимости от свойств вашей коллекции):

tbl = new DataTable();
foreach(var day in Week) {
    tbl.Columns.Add(new DataColumn(day.Name, Task));
}

foreach(var cat in Categories) {
    var tasks = AllTasks.Where(t => t.Category.equals(cat) && Week.Contains(t.Day));
    if (tasks.Any()) {
        foreach (var task in tasks) { 
            var row = new DataRow();
            row.SetField(day.Name, task);
            tbl.Rows.Add(row);
        }
    }
}

Тогда вы можете привязать DataGrid к этой DataTable:

<!-- Wherever you want the datagrid -->
<DataGrid ItemsSource="{Binding, NotifyOnSourceUpdated=True}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header={Binding Columns[0].Name} CellTemplate="{StaticResource TaskTemplate}"/>
        <!-- Six more columns for the other days -->
    </DataGrid.Columns>
</DataGrid>
...