using System; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Metadata; using Avalonia.Controls.Primitives; using Avalonia.Data; using Avalonia.Interactivity; namespace ControlCatalog.Controls { [PseudoClasses(":selected")] public class SelectableButton : ToggleButton, ISelectable { /// /// Defines the property. /// public static readonly StyledProperty IsSelectedProperty = AvaloniaProperty.Register(nameof(IsSelected), false, defaultBindingMode: BindingMode.TwoWay); /// /// Defines the event. /// public static readonly RoutedEvent IsSelectedChangedEvent = RoutedEvent.Register( nameof(IsSelectedChanged), RoutingStrategies.Bubble); public SelectableButton() { UpdatePseudoClasses(IsSelected); } /// /// Gets or sets whether the is selected. /// public bool IsSelected { get => GetValue(IsSelectedProperty); set => SetValue(IsSelectedProperty, value); } /// /// Raised when the property value changes. /// public event EventHandler? IsSelectedChanged { add => AddHandler(IsSelectedChangedEvent, value); remove => RemoveHandler(IsSelectedChangedEvent, value); } /// protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { base.OnPropertyChanged(change); if (change.Property == IsSelectedProperty) { var newValue = change.GetNewValue(); UpdatePseudoClasses(newValue); OnIsSelectedChanged(new RoutedEventArgs(IsSelectedChangedEvent)); } } private void UpdatePseudoClasses(bool isSelected) { PseudoClasses.Set(":selected", isSelected); } /// /// Called when changes. /// /// Event arguments for the routed event that is raised by the default implementation of this method. protected virtual void OnIsSelectedChanged(RoutedEventArgs e) { RaiseEvent(e); } } }