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);
}
}
}