使用MVVM Light开发日历时ObservableCollection变更后ItemsControl不更新
问题根源
ObservableCollection<T> 仅会在集合本身发生添加、删除、替换元素这类整体操作时向UI发送变更通知,集合内部元素的属性变更需要元素类自行实现属性变更通知机制。你当前的Dates类没有实现INotifyPropertyChanged接口,修改IsSelected等属性后,绑定的UI无法收到变更通知,自然不会触发样式更新。
解决方案
因为你使用了MVVM Light框架,直接让Dates类继承框架提供的ObservableObject基类即可快速实现属性通知,修改后的Dates类代码如下:
using GalaSoft.MvvmLight; public class Dates : ObservableObject { public Dates(DateTime day, int currentMonth) { Date = day; Day = day.Day.ToString(); IsInactive = day.Month != currentMonth; IsToday = day.DayOfYear == DateTime.Today.DayOfYear; } #region Properties private DateTime _date; public DateTime Date { get => _date; set { _date = value; RaisePropertyChanged(); } } private string _day; public string Day { get => _day; set { _day = value; RaisePropertyChanged(); } } private bool _isInactive; public bool IsInactive { get => _isInactive; set { _isInactive = value; RaisePropertyChanged(); } } private bool _isToday; public bool IsToday { get => _isToday; set { _isToday = value; RaisePropertyChanged(); } } private bool _isSelected; public bool IsSelected { get => _isSelected; set { _isSelected = value; RaisePropertyChanged(); } } #endregion Properties }
可选优化
你当前的点击命令处理方法遍历整个集合查找匹配日期,可简化为:
private void DayClickedeCommandParameterhandling(DateTime s) { var target = List.FirstOrDefault(d => d.Date == s); if (target != null) { // 如果需要单选逻辑可以先把之前选中的项IsSelected重置为false // foreach(var item in List) item.IsSelected = false; target.IsSelected = true; } }
修改后重新运行,点击按钮即可触发对应的DataTrigger样式更新。
内容的提问来源于stack exchange,提问作者Andreas Prinz
相关产品推荐
相关产品推荐

