Обновляемый Binding сгруппированных данных

Всем добрый день, задача следующая, имеется коллекция объектов реализующая интерфейс INotifyCollectionChanged (Предположим ObservableCollection), в данной коллекции хранятся объекты с свойствами DateTime и Value, также в коллекцию могут приходить новые данные (допустим с сервера), требуется сгруппировать эти данные по году, год по кварталам, кварталы по месяцам, месяца по дням, а внутри дней отображать объекты, в качестве элемента управления для отображения используется TreeView.

Группировка проблемы не доставляет, так же не доставляет проблемы забиндить данные в TreeView, проблема с обновлением данных, дело в том, что стандартные GroupBy и Select возвращают интерфейсы не являющиеся INotifyCollectionChanged, соответственно когда они изменяются интерфейс об этом ничего не знает.

Код группировки:

this.GroupingDatesAndValues = this.DatesAndValues.GroupBy(year => year.DateTime.Year).
                   Select
                   (
                        year => year.GroupBy(quarter => ((quarter.DateTime.Month - 1) / 3 + 1)).
                        Select
                        (
                            quarter =>quarter.GroupBy(month => month.DateTime.Month).
                            Select
                            (
                                month => month.GroupBy(day => day.DateTime.Day).
                                Select
                                (
                                    day =>day.Select(Value=>Value)
                                )
                            )
                        )
                   );

Xaml Модель TreeView (Конвертеры просто преобразуют значения в нужный мне текст заголовка):

<TreeView  BorderThickness="0"  VirtualizingStackPanel.IsVirtualizing="True" ItemsSource="{Binding GroupingDatesAndValues}" Foreground="White" Margin="0,0,-4,-2" >
        <TreeView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </TreeView.ItemsPanel>
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding .}">
                <TreeViewItem Header="{Binding .,Converter={StaticResource ControlConvertersYear}}"></TreeViewItem>
                <!-- child node will be a MasterAction -->
                <HierarchicalDataTemplate.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding .}">
                        <TreeViewItem Header="{Binding .,Converter={StaticResource ControlConvertersQuarter}}"></TreeViewItem>
                        <HierarchicalDataTemplate.ItemTemplate>
                            <HierarchicalDataTemplate ItemsSource="{Binding .}">
                                <TreeViewItem Header="{Binding .,Converter={StaticResource ControlConvertersMonth}}"></TreeViewItem>
                                <HierarchicalDataTemplate.ItemTemplate>
                                    <HierarchicalDataTemplate>
                                        <TreeViewItem Name="DayItem"  Header="{Binding .,Converter={StaticResource ControlConvertersDay}}" HorizontalAlignment="Stretch">
                                            <TreeViewItem HorizontalAlignment="Stretch">
                                                <TreeViewItem.Header>
                                                    <DataGrid Margin="0"  ItemsSource="{Binding .}" BorderThickness="0" ColumnWidth="auto"   AutoGenerateColumns="False" CanUserResizeRows="False" IsReadOnly="True" IsTextSearchCaseSensitive="True" >
                                                        <DataGrid.Columns>
                                                            <DataGridTextColumn Header="DateTime" Binding="{Binding Path=DateTime}">
                                                                <DataGridTextColumn.HeaderTemplate>
                                                                    <DataTemplate>
                                                                        <TextBlock Text="DateTime" Margin="15,0,7,0" TextTrimming="WordEllipsis"/>
                                                                    </DataTemplate>
                                                                </DataGridTextColumn.HeaderTemplate>
                                                                <DataGridTextColumn.ElementStyle>
                                                                    <Style TargetType="{x:Type TextBlock}" >
                                                                        <Setter Property="Margin" Value="15,0,7,0"/>
                                                                        <Setter Property="TextTrimming" Value="WordEllipsis"></Setter>
                                                                    </Style>
                                                                </DataGridTextColumn.ElementStyle>
                                                            </DataGridTextColumn>
                                                            <DataGridTextColumn Header="Value" Binding="{Binding Path=Value}">
                                                                <DataGridTextColumn.HeaderTemplate>
                                                                    <DataTemplate>
                                                                        <TextBlock Text="Value" Margin="15,0,7,0"  TextTrimming="WordEllipsis"/>
                                                                    </DataTemplate>
                                                                </DataGridTextColumn.HeaderTemplate>
                                                                <DataGridTextColumn.ElementStyle>
                                                                    <Style TargetType="{x:Type TextBlock}" >
                                                                        <Setter Property="Margin" Value="15,0,7,0"/>
                                                                        <Setter Property="TextTrimming" Value="WordEllipsis"></Setter>
                                                                    </Style>
                                                                </DataGridTextColumn.ElementStyle>
                                                            </DataGridTextColumn>
                                                        </DataGrid.Columns>
                                                    </DataGrid>
                                                </TreeViewItem.Header>
                                            </TreeViewItem>
                                        </TreeViewItem>
                                    </HierarchicalDataTemplate>
                                </HierarchicalDataTemplate.ItemTemplate>
                            </HierarchicalDataTemplate>
                        </HierarchicalDataTemplate.ItemTemplate>
                    </HierarchicalDataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

Следует отметить, что проблема схожа с описанной мной в данном вопросе, возможно и решение должно быть схожим: https://ru.stackoverflow.com/questions/1237614/Выборочный-биндинг-коллекций-внутри-коллекций

Схема работы

Заранее Спасибо!

P.S

Я чувствую, что решение бежит за мной и оно рядом, но я быстрее :)


Ответы (0 шт):