开发者

How can I create a Grid with it's X and Y axis bound to different collections?

I need to display something that shows a Week of days along the Columns, and a list of Categories along the Rows, and a list of Tasks that are due in the Cells (See sketch below)

I feel like the solution should be simple, but I'm drawing a blank as to how to bind such a thing.

Both the Rows, Columns, and data items in the Cells are dynamic based on what week the user is viewing, and ideally I'd like to hide categories that do not have any tasks for the currently viewed Week. 开发者_StackOverflow社区I have collection properties for the currently Viewed Week, the list of Categories, and the list of Tasks, and each Task has a DueDate and Category associated with it....

How can I create a Grid with it's X and Y axis bound to different collections?

Edit

My database looks like this:

TASK TABLE

TaskId
CategoryId
OtherProperties

TASK INSTANCE TABLE

TaskInstanceId
ParentTaskId
DueDate

I have a stored procedure that accepts a range of dates and returns a list of the following class (need to calculate recurring events)

TaskInstanceId
ParentTaskId
Name
Category
DueDate
OtherProperties

I was trying to do this with a 3rd class which contains

Date
List<Task>


I think I might have found a way to do it... I need to rearrange my Data a bit

  • My main ViewModel will contain ObservableCollection<DateTime> CurrentWeek and ObservableCollection<Category> CurrentTasks

  • The Category class should have ObservableCollection<Task> Tasks

  • And Task should have ObservableCollection<TaskInstances> Occurences

The main ViewModel should also subscribe to CurrentWeek.CollectionChanged, and based on what the dates are in the collection, update each Category.Task[x].Occurences if Category.Task.IsRecurring == true

Then I think I can use the following structure to get what I want. I'll update this post when I know if this works or not

Update: It works :)

How can I create a Grid with it's X and Y axis bound to different collections?


I'd probably go with a DataTable property that you rebuild when you change weeks, then bind a DataGrid to that DataTable.

Rebuild code would look something like this (will obviously need tweaking based on your collection properties):

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);
        }
    }
}

Then you could bind a DataGrid to that 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>


Considering that we are talking about WPF, I assume that Viewed Week, Categories, and the Tasks are objects of the model. So what I would do in this case, is to create ModelView that combines that objects based on your app logic relationship into another ModelView's Week object, whom properties actually end up binded to actual UI (Grid, ListView, Telerik control, whatever...).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜