You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Connected.Components/Components/ItemsControlBase.cs

115 lines
2.3 KiB

2 years ago
using Connected.Annotations;
using Microsoft.AspNetCore.Components;
namespace Connected.Components;
public abstract class ItemsControlBase<TChildComponent> : UIComponent
where TChildComponent : UIComponent
{
/// <summary>
/// Collection of T
/// </summary>
[Parameter]
[Category(CategoryTypes.General.Data)]
public RenderFragment ChildContent { get; set; }
/// <summary>
/// Items - will be ignored when ItemsSource is not null
/// </summary>
public List<TChildComponent> Items { get; } = new List<TChildComponent>();
private int _selectedIndexField = -1;
/// <summary>
/// Selected Item's index
/// </summary>
[Parameter]
[Category(CategoryTypes.General.Behavior)]
public int SelectedIndex
{
get => _selectedIndexField;
set
{
if (SelectedIndex == value)
return;
LastContainer = _selectedIndexField >= 0 ? SelectedContainer : null;
_selectedIndexField = value;
SelectionChanged();
StateHasChanged();
SelectedIndexChanged.InvokeAsync(value);
}
}
[Parameter]
public EventCallback<int> SelectedIndexChanged { get; set; }
/// <summary>
/// Gets the Selected TChildComponent
/// </summary>
public TChildComponent LastContainer { get; private set; } = null;
/// <summary>
/// Gets the Selected TChildComponent
/// </summary>
public TChildComponent SelectedContainer
{
get => SelectedIndex >= 0 && Items.Count > SelectedIndex ? Items[SelectedIndex] : null;
}
protected override Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
if (Items.Count > 0 && SelectedIndex < 0)
MoveTo(0);
}
return base.OnAfterRenderAsync(firstRender);
}
internal bool _moveNext = true;
/// <summary>
/// Move to Previous Item
/// </summary>
public void Previous()
{
_moveNext = false;
if (SelectedIndex > 0)
SelectedIndex--;
else
SelectedIndex = Items.Count - 1;
}
/// <summary>
/// Move to Next Item
/// </summary>
public void Next()
{
_moveNext = true;
if (SelectedIndex < (Items.Count - 1))
SelectedIndex++;
else
SelectedIndex = 0;
}
/// <summary>
/// Move to Item at desired index
/// </summary>
public void MoveTo(int index)
{
if (SelectedIndex != index)
{
_moveNext = index >= SelectedIndex;
SelectedIndex = index;
}
}
protected virtual void SelectionChanged() { }
public virtual void AddItem(TChildComponent item) { }
}