0

私は次のクラスを持っています:

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

ObservableCollection< BankingEntry> オブジェクトを WPF TreeView の ItemsSource にバインドし、アイテムを次のツリー構造で表示したいと考えています。

- -年

- - - 月

- - - - -日

したがって、コレクションに 2012 年 12 月 30 日、2012 年 12 月 31 日、2013 年 1 月 1 日のエントリ日を持つ 3 つのアイテムがある場合、次のツリー ビュー構造が得られます。

---2012年

------12

----------30

----------31

---2013年

------01

-------01

理想的には、アイテムがコレクションに追加またはコレクションから削除されたときに、ツリー ビューが自動的に更新されるようにしたいと考えています。オブジェクトの日付は変更されないため、更新について心配する必要はありません。

前もって感謝します

4

2 に答える 2

1

やや古い質問ですが、同じ問題がありました。これが私がやったことです

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>
于 2013-06-25T00:47:26.460 に答える
1

上記の TI からの回答は素晴らしく、多くの時間を節約できました。私が行ったように、クエリ構文の代わりにメソッド構文でこれを必要とする可能性のある人のために、ここに更新を投稿します。

var d = dates.GroupBy(date => date.Year)
            .Select(year => new DateHierarchy
            {
                Level = 1,
                Value = new DateTime(year.Key, 1, 1),
                Children = year.GroupBy(date => date.Month)
                    .Select(month => new DateHierarchy
                    {
                        Level = 2,
                        Value = new DateTime(year.Key, month.Key, 1),
                        Children = month.GroupBy(date => date.Day)
                            .Select(day => new DateHierarchy
                            {
                                Level = 3,
                                Value = new DateTime(year.Key, month.Key, day.Key),
                                Children = null
                            })
                    })
            });

また、アイテムを曜日別にグループ化する必要もありました。これを行うには、次のようにCultureInfo.CurrentCulture.Calendar.GetWeekOfYear()ISOWeek.ToDateTime()を使用できます。

var d = dates.GroupBy(date => date.Year)
            .Select(year => new DateHierarchy
            {
                Level = 1,
                Value = new DateTime(year.Key, 1, 1),
                Children = year.GroupBy(date => date.Month)
                    .Select(month => new DateHierarchy
                    {
                        Level = 2,
                        Value = new DateTime(year.Key, month.Key, 1),
                        Children = month.GroupBy(date => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday))
                            .Select(week => new DateHierarchy
                            {
                                Level = 3,
                                Value = ISOWeek.ToDateTime(year.Key, week.Key, DayOfWeek.Sunday),
                                WeekOfYear = week.Key,
                                Children = week.GroupBy(date => date.Day)
                                    .Select(day => new DateHierarchy
                                    {
                                        Level = 4,
                                        Value = new DateTime(year.Key, month.Key, day.Key),
                                        Children = null
                                    })
                            })
                    })
            });

これを正しく構築して表示するには、 DateHierarchyクラスにWeekOfYearプロパティを追加し、 xamlに適切なDataTrigger を追加する必要があります。

于 2020-04-01T21:40:47.453 に答える