Обновляемый 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
Я чувствую, что решение бежит за мной и оно рядом, но я быстрее :)
