@typeparam TItem where TItem : LANCommander.SDK.Models.IKeyedModel @namespace LANCommander.UI.Components @code { [Parameter] public string LeftTitle { get; set; } = ""; [Parameter] public string RightTitle { get; set; } = ""; [Parameter] public string Style { get; set; } = ""; [Parameter] public bool Searchable { get; set; } [Parameter] public Func TitleSelector { get; set; } [Parameter] public IEnumerable DataSource { get; set; } [Parameter] public ICollection Values { get; set; } = new List(); [Parameter] public EventCallback> ValuesChanged { get; set; } IEnumerable TransferItems { get; set; } = new List(); List TargetKeys { get; set; } = new(); protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { TransferItems = DataSource.Select(i => new TransferItem() { Key = i.Id.ToString(), Title = TitleSelector.Invoke(i) }); if (Values != null) TargetKeys = Values.Select(i => i.Id.ToString()).ToList(); } } async Task OnChange(TransferChangeArgs e) { Values = DataSource.Where(i => e.TargetKeys.Contains(i.Id.ToString())).ToList(); if (ValuesChanged.HasDelegate) await ValuesChanged.InvokeAsync(Values); } }