using System.Collections.Generic; using System.Reactive; using System.Reactive.Linq; using DesertPaintCodex.Services; using ReactiveUI; namespace DesertPaintCodex.ViewModels { public class CreateProfileViewModel : ViewModelBase { private string _profileName = string.Empty; public string ProfileName { get => _profileName; set => this.RaiseAndSetIfChanged(ref _profileName, value); } private readonly ObservableAsPropertyHelper _duplicateWarning; public bool DuplicateWarning => _duplicateWarning.Value; public CreateProfileViewModel() { List profiles = ProfileManager.GetProfileList(); // Duplicate warning display logic. this.WhenAnyValue(x => x.ProfileName) .Select(profileName => (!string.IsNullOrWhiteSpace(profileName) && profiles.Contains(profileName))) .ToProperty(this, x => x.DuplicateWarning, out _duplicateWarning); // TODO: Use proper validation to decorate the TextBox, as well. // OK button enabling logic. var okEnabled = this.WhenAnyValue( x => x.ProfileName, x => !string.IsNullOrWhiteSpace(x) && !profiles.Contains(x)); // Button commands. Cancel = ReactiveCommand.Create(() => { }); Ok = ReactiveCommand.Create(() => { ProfileManager.CreateNewProfile(_profileName); }, okEnabled); } public ReactiveCommand Cancel { get; } public ReactiveCommand Ok { get; } } }