📄 src/App/Views/Panels/WeatherPanel.axaml.cs
using System;
using System.Globalization;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Data.Converters;
using MMirror.App.ViewModels.Panels;
using MMirror.Integrations.Smhi;

namespace MMirror.App.Views.Panels;

public partial class WeatherPanel : UserControl
{
    public WeatherPanel()
    {
        InitializeComponent();
    }

    protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
    {
        base.OnAttachedToVisualTree(e);

        if (DataContext is WeatherPanelViewModel vm)
        {
            vm.SubscribeToUpdates();
        }
    }

    protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
    {
        if (DataContext is WeatherPanelViewModel vm)
        {
            vm.UnsubscribeFromUpdates();
        }

        base.OnDetachedFromVisualTree(e);
    }
}

public sealed class WeatherSymbolIconConverter : IValueConverter
{
    public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) =>
        value is WeatherSymbol symbol ? $"avares://MMirror.App/Assets/smhi/{(int)symbol}.svg" : null;

    public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) =>
        throw new NotSupportedException();
}