using CommunityToolkit.Mvvm.ComponentModel; using System.Text.RegularExpressions; namespace ColorPicker.ViewModels; public partial class ColorPickerViewModel : ObservableObject { [ObservableProperty] private byte red = 0, green = 0, blue = 0; [ObservableProperty] private string color = "#000000", hexInput = "#000000"; public ColorPickerViewModel() { calculateColorFromRgb(); } partial void OnRedChanged(byte value) => calculateColorFromRgb(); partial void OnGreenChanged(byte value) => calculateColorFromRgb(); partial void OnBlueChanged(byte value) => calculateColorFromRgb(); partial void OnHexInputChanged(string value) { if (!Regex.IsMatch(value, @"^#[\dA-F]{6}$", RegexOptions.IgnoreCase)) return; this.Color = HexInput; calculateRgbFromColor(); } private void calculateRgbFromColor() { var parse = (int start, int length) => byte.Parse(this.Color.Substring(start, length), System.Globalization.NumberStyles.HexNumber); (this.Red, this.Green, this.Blue) = (parse(1, 2), parse(3, 2), parse(5, 2)); } private void calculateColorFromRgb() { this.Color = $"#{this.Red:X2}{this.Green:X2}{this.Blue:X2}"; this.HexInput = this.Color; } }