📄 src/App/ViewModels/MainViewModel.cs
using System;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;

namespace MMirror.App.ViewModels;

public partial class MainViewModel : ViewModelBase
{
    private readonly TimeProvider timeProvider;
    private readonly DispatcherTimer dispatcherTimer;

    [ObservableProperty]
    public partial DateTimeOffset CurrentTime { get; private set; }

    public MainViewModel(TimeProvider timeProvider)
    {
        this.timeProvider = timeProvider;
        CurrentTime = timeProvider.GetLocalNow();

        dispatcherTimer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(1) };
        dispatcherTimer.Tick += OnTick;
    }

    public void SubscribeToUpdates()
    {
        dispatcherTimer.Start();
    }

    private void OnTick(object? sender, EventArgs e)
    {
        CurrentTime = timeProvider.GetLocalNow();
    }

    public void UnsubscribeFromUpdates()
    {
        dispatcherTimer.Stop();
    }
}

internal static class MainViewModelServiceCollectionExtensions
{
    extension(IServiceCollection services)
    {
        public IServiceCollection AddMainViewModel()
        {
            services.TryAddSingleton(TimeProvider.System);
            services.AddTransient<MainViewModel>();
            return services;
        }
    }
}