2013-02-14 4 views
0

У меня есть следующий класс:Группа даты по годам, месяцам и даты в WPF TreeView

public class BankingEntry 
{ 
    private DateTime entryDate; 
    public DateTime EntryDate { get { return entryDate; } } 
} 

Я хочу, чтобы привязать ObservableCollection < BankingEntry> объект в ItemsSource из в WPF TreeView и есть отображать элементы в следующей структуре дерева:

--- Год

------ Месяц

--------- День

Так что, если моя коллекция была 3 пунктов с въездной датой 2012-12-30, 2012-12-31 и 2013-01-01, если бы получить следующую структуру в виде дерева:

--- 2012

------ 12

--------- 30

--------- 31

--- 2013

------ 01

--------- 01

В идеале я хотел бы древовидное автоматического обновления, когда элемент добавляется или удаляется из коллекции. Даты объектов никогда не изменятся, поэтому мне не нужно беспокоиться об обновлениях.

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

ответ

0

Несколько старый вопрос, но была такая же проблема, и вот что я в конечном итоге делает

Создан интерфейс IHierarchy

interface IHierarchy<T> 
{ 
    T Value { get; set; } 

    IEnumerable<IHierarchy<T>> Children { get; set; } 

    int Level { get; set; } 
} 

Тогда реализацию Иерархия к датам

private class DateHierarchy : IHierarchy<DateTime> 
{ 
    public DateTime Value { get; set; } 

    public IEnumerable<IHierarchy<DateTime>> Children { get; set; } 

    public int Level { get; set; } 
} 

Способ строить даты из списка дат

private void BuildDates() 
{ 
    var start = new DateTime(2010, 01, 01); 

    var end = new DateTime(2015, 12, 31); 

    var dates = new List<DateTime>(); 

    for (var date = start; date <= end; date = date.AddDays(1)) 
    { 
     dates.Add(date); 
    } 

    var d = from date in dates 
      group date by date.Year into year 
      select new DateHierarchy 
      { 
       Level = 1, 
       Value = new DateTime(year.Key, 1, 1), 
       Children = from date in year 
          group date by date.Month into month 
          select new DateHierarchy 
          { 
           Level = 2, 
           Value = new DateTime(year.Key, month.Key, 1), 
           Children = from day in month 
              select new DateHierarchy 
              { 
               Level = 3, 
               Value = day, 
               Children = null 
              } 
          } 
      }; 

    Dates = new ObservableCollection<IHierarchy<DateTime>>(d); 
} 

и, наконец, в xaml

<TreeView ItemsSource="{Binding Dates}" 
      SelectedItemChanged="TreeView_SelectedItemChanged"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
      <TextBlock x:Name="Date" /> 
      <HierarchicalDataTemplate.Triggers> 
       <DataTrigger Binding="{Binding Level}" Value="1"> 
        <Setter TargetName="Date" Property="Text" Value="{Binding Value, StringFormat=yyyy}" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Level}" Value="2"> 
        <Setter TargetName="Date" Property="Text" Value="{Binding Value, StringFormat=MMMM}" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Level}" Value="3"> 
        <Setter TargetName="Date" Property="Text" Value="{Binding Value, StringFormat=dd/MM/yy}" /> 
       </DataTrigger> 
      </HierarchicalDataTemplate.Triggers> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 
Смежные вопросы