You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF ListView绑定ObservableCollection无法显示日历条目问题求助

解决ListView绑定ObservableCollection后不显示日历项的问题

看起来你的问题核心是DataContext未正确关联,再加上可能的日期解析隐患,下面一步步帮你排查修复:


1. 为UserControl设置正确的DataContext

你的Kalender用户控件没有把DataContext指向KalenderVM实例,导致ListView找不到Termine集合,进而每个日历项的绑定无法定位到Start/Finish属性。修改Kalender的构造函数:

public partial class Kalender : UserControl
{
    public Kalender()
    {
        InitializeComponent();
        // 添加这行,将ViewModel绑定到控件的DataContext
        DataContext = new KalenderVM();
    }
}

2. 确保DateTime解析成功(避免无效日期)

你用DateTime.TryParse处理"25.10.2021"这种格式时,可能会因为系统默认文化设置(比如en-US)导致解析失败,生成无效日期。建议指定文化信息确保解析正确:

先在ViewModel里引入System.Globalization,再修改解析代码:

using System.Globalization;

// ...

public KalenderVM()
{
    DateTime dateValue1;
    DateTime dateValue2;
    // 指定德语文化适配dd.MM.yyyy格式
    var deCulture = CultureInfo.GetCultureInfo("de-DE");
    
    DateTime.TryParse("25.10.2021 6:00", deCulture, DateTimeStyles.None, out dateValue1);
    DateTime.TryParse("25.10.2021 16:00", deCulture, DateTimeStyles.None, out dateValue2);
    Termine.Add(new Termin(dateValue1, dateValue2, "Jan", "Anker"));
    
    DateTime.TryParse("26.10.2021 6:00", deCulture, DateTimeStyles.None, out dateValue1);
    DateTime.TryParse("26.10.2021 16:00", deCulture, DateTimeStyles.None, out dateValue2);
    Termine.Add(new Termin(dateValue1, dateValue2, "Jan", "Anker"));
    
    DateTime.TryParse("27.10.2021 6:00", deCulture, DateTimeStyles.None, out dateValue1);
    DateTime.TryParse("27.10.2021 18:00", deCulture, DateTimeStyles.None, out dateValue2);
    Termine.Add(new Termin(dateValue1, dateValue2, "Jan", "Frei"));
}

3. 检查XAML中CalendarView的完整结构

确保你的XAML标签闭合,没有语法错误:

<ListView ItemsSource="{Binding Termine}">
    <ListView.View>
        <controls:CalendarView 
            ItemBeginBinding="{Binding Start}" 
            ItemEndBinding="{Binding Finish}">
            <!-- 可按需添加CalendarView的模板、样式等配置 -->
        </controls:CalendarView>
    </ListView.View>
</ListView>

4. 可选:优化ViewModel集合属性(避免空引用)

虽然你已经初始化了_termine,可以再优化属性getter确保不会返回null:

private ObservableCollection<Termin> _termine;
public ObservableCollection<Termin> Termine
{
    get 
    { 
        _termine ??= new ObservableCollection<Termin>();
        return _termine; 
    }
    set { _termine = value; }
}

做完这些修改后,你的ListView应该能正确加载ViewModel中的3个测试日历项了。最关键的问题是控件没有绑定到ViewModel,导致绑定上下文错误,找不到对应的属性。

内容的提问来源于stack exchange,提问作者der_nala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:37:49