C# LiveCharts2饼图修改数据后视图无法实时更新求助
解决LiveCharts2饼图修改数据后视图不刷新的问题
问题场景
修改ObservableCollection<cDay>中元素的oColor属性后,ViewModel的Series数组已重新生成并触发PropertyChanged通知,但PieChart视图未自动更新,仅当调整窗口大小后才显示正确的颜色。
解决方案
方案1:直接更新现有Series的Fill属性(推荐)
无需每次重新生成整个Series数组,直接修改对应Series的Fill属性,LiveCharts会自动检测变化并刷新视图,性能更优。
修改ViewModel中的UpdateSerie方法:
private void UpdateSerie(string sName) { foreach (cDay item in data) { if (item.Label != sName) continue; SKColor color = item.oColor.Color; if (color.ToString().ToUpper() == "#FFFF0000") // 红色 { item.oColor = oColorGreen; } else if (color.ToString().ToUpper() == "#FF2AFF00") // 绿色 { item.oColor = oColorDefault; } else if (color.ToString().ToUpper() == "#FFA5A5A5") // 默认灰色 { item.oColor = oColorRed; } // 定位到对应Series并更新Fill属性 var targetSeries = Series.FirstOrDefault(s => s.Name == sName) as PieSeries<cDay>; targetSeries?.SetFill(item.oColor); break; } // 移除原有的InitSeries()调用 }
方案2:强制触发图表刷新
如果仍需要保留重新生成Series的逻辑,可在更新完成后调用图表的Refresh()方法强制刷新视图:
修改Series_DataPointerDown方法:
private void Series_DataPointerDown(IChartView chart, IEnumerable<ChartPoint<cDay, DoughnutGeometry, LabelGeometry>> points) { foreach (var point in points) { string sOldName = point.Model?.Label; UpdateSerie(sOldName); } // 强制刷新图表视图 chart.Refresh(); }
额外优化
View中Series绑定无需双向模式,改为单向绑定即可:
<lvc:PieChart Series="{Binding Series, Mode=OneWay}" EasingFunction="{x:Null}"/>
内容的提问来源于stack exchange,提问作者Guillaume Bertin
相关产品推荐
相关产品推荐

