Conditional Draw

This sample uses C# 12 features, it also uses features from the CommunityToolkit.Mvvm package, you can learn more about it here.

sample image

View model

using System;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using SkiaSharp;
using LiveChartsCore;
using LiveChartsCore.ConditionalDraw;
using LiveChartsCore.Defaults;
using LiveChartsCore.SkiaSharpView;
using LiveChartsCore.SkiaSharpView.Painting;
using LiveChartsCore.Kernel.Sketches;

namespace ViewModelsSamples.General.ConditionalDraw;

public class ViewModel
{
    private readonly ObservableCollection<ObservableValue> _values = [];

    public ViewModel()
    {
        var dangerPaint = new SolidColorPaint(SKColors.Red);

        _values = [
            new(2),
            new(8),
            new(4)
        ];

        var series = new ColumnSeries<ObservableValue>
        {
            Name = "Mary",
            Values = _values
        }
        .OnPointMeasured(point =>
        {
            if (point.Visual is null) return;

            var isDanger = point.Model?.Value > 5;

            point.Visual.Fill = isDanger
                ? dangerPaint
                : null; // when null, the series fill is used // mark
        });

        Series = [series];

        Randomize();
    }

    public ISeries[] Series { get; set; }

    public RectangularSection[] Sections { get; set; } = [
        new RectangularSection
        {
            Label = "Danger zone!",
            LabelSize = 15,
            LabelPaint = new SolidColorPaint(SKColors.Red)
            {
                SKTypeface = SKTypeface.FromFamilyName("Arial", SKFontStyle.Bold)
            },
            Yj = 5,
            Fill = new SolidColorPaint(SKColors.Red.WithAlpha(50))
        }
    ];

    public ICartesianAxis[] Y { get; set; } = [
        new Axis { MinLimit = 0 }
    ];

    private async void Randomize()
    {
        var r = new Random();

        while (true)
        {
            await Task.Delay(3000);

            foreach (var item in _values)
            {
                item.Value = r.Next(0, 10);
            }
        }
    }
}

XAML

<UserControl x:Class="UnoWinUISample.General.ConditionalDraw.View"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:lvc="using:LiveChartsCore.SkiaSharpView.WinUI"
            xmlns:vms="using:ViewModelsSamples.General.ConditionalDraw"
            mc:Ignorable="d">
    <UserControl.DataContext>
        <vms:ViewModel/>
    </UserControl.DataContext>
    <lvc:CartesianChart
        Series="{Binding Series}"
        Sections="{Binding Sections}"
        YAxes="{Binding Y}">
    </lvc:CartesianChart>
</UserControl>

Articles you might also find useful: