如何通过SfContextMenu修改SfScheduler中预约的属性?
核心诊断
问题本质是数据源变更未被组件正确感知,或修改的并非绑定到Scheduler的原始数据实例,导致刷新后仍读取旧值。
解决方案
1. 给数据模型实现INotifyPropertyChanged
如果ScheduleData.BlockData未实现该接口,修改CategoryColor后组件无法自动感知属性变化,即使调用刷新也会读取旧值。修改模型类:
public class BlockData : INotifyPropertyChanged { private string _categoryColor; public string CategoryColor { get => _categoryColor; set { if (_categoryColor != value) { _categoryColor = value; OnPropertyChanged(nameof(CategoryColor)); } } } // 其他属性(如Id、StartTime等)... public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 修改绑定的原始数据源,而非组件副本
ScheduleRef.GetEventsAsync()获取的是组件内部的事件副本,修改它不会同步到你绑定的原始集合。直接修改Scheduler绑定的Events集合中的实例:
// 假设你绑定到Scheduler的事件集合名为EventsCollection private async Task ChangeColor(ScheduleData.BlockData data, string color) { var targetEvent = EventsCollection.FirstOrDefault(q => q.Id == data.Id); if (targetEvent != null) { targetEvent.CategoryColor = color; } // 仅需调用事件刷新即可,无需重复调用组件刷新 await InvokeAsync(() => ScheduleRef.RefreshEventsAsync()); }
3. 修正OnEventRendered的样式处理逻辑
确保ApplyCategoryColor能正确处理非空值,同时兜底处理CategoryColor为null的情况:
public void OnEventRendered(EventRenderedArgs<ScheduleData.BlockData> args) { var attributes = args.Attributes ?? new Dictionary<string, object>(); if (!string.IsNullOrEmpty(args.Data.CategoryColor)) { // 直接设置背景色,或调用你的封装方法 attributes = ScheduleData.ApplyCategoryColor(args.Data.CategoryColor, attributes, CurrentView); } args.Attributes = attributes; }
4. 确认上下文菜单传递的EventData是原始实例
检查OnOpen事件中是否正确获取并赋值右键点击的原始事件数据:
public void OnOpen(MenuOpenEventArgs args) { var eventInfo = args.TargetInfo as EventInfo<ScheduleData.BlockData>; if (eventInfo != null) { // 确保EventData是绑定集合中的原始实例 EventData = eventInfo.EventData; isEvent = true; // 其他状态设置逻辑... } }
内容的提问来源于stack exchange,提问作者Cyril
相关产品推荐
相关产品推荐

