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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:15:58