当前位置: 首页 > 知识库问答 >
问题:

在WPF树视图中按年、月和日期分组日期

鲁霄
2023-03-14

我有以下课程:

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

我想绑定一个可观察的收藏

---年

------月

---------一天

因此,如果我的收藏中有3个条目的输入日期分别为2012-12-30、2012-12-31和2013-01-01,则if将获得以下树状图结构:

---2012

------12

---------30

---------31

---2013年

------01

---------01

理想情况下,我希望树视图在集合中添加或删除项目时自动更新。对象的日期永远不会改变,所以我不必担心更新。

提前谢谢

共有2个答案

桓喜
2023-03-14

上面我的答案很好,节省了我很多时间。在这里为任何可能需要此方法语法(如我所做的)而不是查询语法的人发布更新。

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。货币文化。日历。GetOBOfDay()以及ISOYork。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

曹涵润
2023-03-14

有些老问题,但有同样的问题,这是我最后做的

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>
 类似资料:
  • 问题内容: 我有一个像这样的简单模型: 我想输出按月细分: 一个月内有多少笔交易() 合并值() 我不确定最好的攻击方法是什么。我已经看到了一些看上去很吓人的额外选择查询,但我的简单想法是告诉我,最好是迭代数字,从任意开始的年/月开始,一直计数到我达到当月,然后简单地抛出查询该月的过滤条件。更多数据库工作-减轻开发人员压力! 什么对你最有意义?有什么好方法可以拉回快速数据表吗?还是我的肮脏方法可能

  • 问题内容: 我想要 但是这个查询不能使用 如何使用SQLAlchemy做到这一点? 问题答案: 假设您的数据库引擎实际上支持诸如之类的功能,则可以尝试 否则你可以像

  • 问题内容: 我有一个表,其中包含有关事件和节日的数据,下面的列记录了它们的开始和结束日期。 开始日期 结束日期 日期格式为。我需要在以下情况下获取事件详细信息。 需要获取所有从当前月份开始的事件,并且结束日期可以说什么。 我对结束日期的概念很清楚。但不确定如何获取开始日期为当前月份的数据。为此,我需要将当前年份和当前月份与数据库中的列进行比较。 谁能帮助我指出我该怎么做? 问题答案:

  • 问题内容: Oracle是否具有内置功能来根据其各个组成部分(年,月和日)创建仅对缺失数据返回null的日期? 我知道,但是我需要首先编写一个字符串,并且运算符和函数都无法轻松处理丢失的数据: 只要是我们最终和: 问题答案: 例如,您可以使用: 不幸的是,Oracle没有一种方法(如果可能)进行转换,否则将返回NULL。SQL Server最近为此目的而引入。 一种选择是为失败的转换编写带有异常处

  • 问题内容: 给定一个在每行上都带有时间戳的表,您将如何格式化查询以适合此特定的json对象格式。 我正在尝试将json对象组织成年/月。 json以查询为基础: 这是我到目前为止的查询- 该查询正在分解,因为它(可预测地)将不同年份组合在一起。 问题答案: 是你想要的。

  • 我需要一个解决方案来解决返回日(周一、周二…),当我输入诸如年,月,日期。