52 lines
1.4 KiB
Plaintext
52 lines
1.4 KiB
Plaintext
@typeparam TItem where TItem : class
|
|
@using System.Linq.Expressions
|
|
@using System.Reflection
|
|
@using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers
|
|
@typeparam TMember where TMember : struct, Enum
|
|
|
|
<InputSelect TValue="TMember" @bind-Value="selected">
|
|
@foreach (var value in enumValues)
|
|
{
|
|
<option value="@value.Key">@value.Value</option>
|
|
}
|
|
</InputSelect><br/>
|
|
|
|
@code {
|
|
[Parameter, EditorRequired] public TItem Model { get; set; } = default!;
|
|
|
|
[Parameter, EditorRequired] public Expression<Func<TItem, TMember>> EnumProperty { get; set; } = null!;
|
|
|
|
[Parameter] public Action? OnChanged { get; set; }
|
|
|
|
private Dictionary<TMember, string> enumValues = new();
|
|
private PropertyInfo modelMemberInfo = null!;
|
|
private TMember selected;
|
|
|
|
protected override void OnInitialized()
|
|
{
|
|
var modelMemberName = ((MemberExpression)EnumProperty.Body).Member.Name;
|
|
modelMemberInfo = typeof(TItem).GetProperty(modelMemberName)!;
|
|
|
|
foreach (var value in Enum.GetValues<TMember>())
|
|
{
|
|
enumValues.Add(value, value.GetDisplayName());
|
|
}
|
|
}
|
|
|
|
protected override void OnAfterRender(bool firstRender)
|
|
{
|
|
var current = (TMember)modelMemberInfo.GetValue(Model)!;
|
|
if (!current.Equals(selected))
|
|
{
|
|
OnValueChanged();
|
|
}
|
|
}
|
|
|
|
private void OnValueChanged()
|
|
{
|
|
modelMemberInfo.SetValue(Model, selected);
|
|
OnChanged?.Invoke();
|
|
}
|
|
|
|
}
|