feat: make button group functional. Update Demo.

This commit is contained in:
rabbitism
2024-01-26 19:20:22 +08:00
parent 34c247d232
commit 7f0c858d81
4 changed files with 101 additions and 7 deletions

View File

@@ -3,6 +3,7 @@ using Avalonia;
using Avalonia.Collections;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using Avalonia.Data;
using Avalonia.Media;
using Avalonia.Metadata;
@@ -10,6 +11,40 @@ namespace Ursa.Controls;
public class ButtonGroup: ItemsControl
{
public static readonly StyledProperty<IBinding?> CommandBindingProperty = AvaloniaProperty.Register<ButtonGroup, IBinding?>(
nameof(CommandBinding));
[AssignBinding]
[InheritDataTypeFromItems(nameof(ItemsSource))]
public IBinding? CommandBinding
{
get => GetValue(CommandBindingProperty);
set => SetValue(CommandBindingProperty, value);
}
public static readonly StyledProperty<IBinding?> CommandParameterBindingProperty = AvaloniaProperty.Register<ButtonGroup, IBinding?>(
nameof(CommandParameterBinding));
[AssignBinding]
[InheritDataTypeFromItems(nameof(ItemsSource))]
public IBinding? CommandParameterBinding
{
get => GetValue(CommandParameterBindingProperty);
set => SetValue(CommandParameterBindingProperty, value);
}
public static readonly StyledProperty<IBinding?> ContentBindingProperty = AvaloniaProperty.Register<ButtonGroup, IBinding?>(
nameof(ContentBinding));
[AssignBinding]
[InheritDataTypeFromItems(nameof(ItemsSource))]
public IBinding? ContentBinding
{
get => GetValue(ContentBindingProperty);
set => SetValue(ContentBindingProperty, value);
}
protected override bool NeedsContainerOverride(object? item, int index, out object? recycleKey)
{
recycleKey = null;
@@ -20,4 +55,28 @@ public class ButtonGroup: ItemsControl
{
return new Button();
}
protected override void PrepareContainerForItemOverride(Control container, object? item, int index)
{
base.PrepareContainerForItemOverride(container, item, index);
if(container is Button button)
{
if ( CommandBinding is not null)
{
button[!Button.CommandProperty] = CommandBinding;
}
if ( CommandParameterBinding is not null)
{
button[!Button.CommandParameterProperty] = CommandParameterBinding;
}
if ( ContentBinding is not null)
{
button[!Button.ContentProperty] = ContentBinding;
}
if (ItemTemplate is not null)
{
button.ContentTemplate = ItemTemplate;
}
}
}
}