Merge pull request #74 from irihitech/buttonGroup

ButtonGroup: make it actually useful.
This commit is contained in:
Dong Bin
2024-01-26 23:11:45 +08:00
committed by GitHub
5 changed files with 102 additions and 8 deletions

View File

@@ -13,10 +13,20 @@
mc:Ignorable="d">
<StackPanel Margin="20" Spacing="20">
<u:ButtonGroup Classes="Primary Solid" ItemsSource="{Binding Items}" />
<u:ButtonGroup Classes="Primary" ItemsSource="{Binding Items}" />
<u:ButtonGroup Classes="Primary Borderless" ItemsSource="{Binding Items}" />
<u:ButtonGroup Classes="Primary Large" ItemsSource="{Binding Items}" />
<u:ButtonGroup Classes="Primary Small" ItemsSource="{Binding Items}" />
<u:ButtonGroup Classes="Primary Solid"
CommandBinding="{Binding InvokeCommand}"
ItemsSource="{Binding Items}" >
<u:ButtonGroup.ItemTemplate>
<DataTemplate x:DataType="vm:ButtonItem">
<TextBlock Text="{Binding Name}" Foreground="{DynamicResource SemiGrey3}"></TextBlock>
</DataTemplate>
</u:ButtonGroup.ItemTemplate>
</u:ButtonGroup>
<u:ButtonGroup Classes="Primary"
ContentBinding="{Binding Name}"
CommandBinding="{Binding InvokeCommand}"
ItemsSource="{Binding Items}" >
</u:ButtonGroup>
</StackPanel>
</UserControl>

View File

@@ -1,11 +1,35 @@
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using System.Windows.Input;
using CommunityToolkit.Mvvm.Input;
using Ursa.Controls;
namespace Ursa.Demo.ViewModels;
public class ButtonGroupDemoViewModel: ViewModelBase
{
public ObservableCollection<string> Items { get; set; } = new ()
public ObservableCollection<ButtonItem> Items { get; set; } = new ()
{
"Ding", "Otter", "Husky", "Mr. 17", "Cass"
new ButtonItem(){Name = "Ding" },
new ButtonItem(){Name = "Otter" },
new ButtonItem(){Name = "Husky" },
new ButtonItem(){Name = "Mr. 17" },
new ButtonItem(){Name = "Cass" },
};
}
public class ButtonItem
{
public string? Name { get; set; }
public ICommand InvokeCommand { get; set; }
public ButtonItem()
{
InvokeCommand = new AsyncRelayCommand(Invoke);
}
private async Task Invoke()
{
await MessageBox.ShowAsync("Hello " + Name);
}
}

View File

@@ -14,7 +14,7 @@ public class MenuViewModel: ViewModelBase
new() { MenuHeader = "Controls", IsSeparator = true },
new() { MenuHeader = "Badge", Key = MenuKeys.MenuKeyBadge },
new() { MenuHeader = "Banner", Key = MenuKeys.MenuKeyBanner },
new() { MenuHeader = "ButtonGroup", Key = MenuKeys.MenuKeyButtonGroup },
new() { MenuHeader = "ButtonGroup", Key = MenuKeys.MenuKeyButtonGroup, Status = "Updated"},
new() { MenuHeader = "Divider", Key = MenuKeys.MenuKeyDivider },
new() { MenuHeader = "DualBadge", Key = MenuKeys.MenuKeyDualBadge },
new() { MenuHeader = "Enum Selector", Key = MenuKeys.MenuKeyEnumSelector },

View File

@@ -63,6 +63,7 @@
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
FontWeight="{TemplateBinding FontWeight}"
Foreground="{TemplateBinding Foreground}" />
</Border>

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