如何在 Blazor 页面的 foreach 循环中调整成员变量?

How to adjust member variables in a foreach loop in a Blazor page?

我的 Blazor 页面中的 foreach 循环存在一些问题。我正在尝试输入绘画的下拉菜单,并让用户 select 从中选择。但是,当我 select 在下拉列表中绘制时,它实际上并没有绑定到输入字段。我知道下拉菜单的逻辑应该可以正常工作,因为我在另一个页面上使用过它,它工作正常。我正在使用本地临时变量,因为我无法更改 foreach 循环中的元素。我也不能使用 for 循环,因为我得到索引越界错误,我想这与获取计数和渲染时间有关。如果有人有更好的建议,我很想听听!代码块在下面,如果您需要更多上下文,这里也是我的回购的 link。提前致谢!

foreach (var elem in newMini.Elements)
                {
                    <div class="@elem.Name">
                        <InputText @bind-Value="elem.Name" placeholder="Element name" />
                        @foreach (var paintUsed in elem.PaintsUsed)
                        {
                            var curPaintUsed = paintUsed;
                            <div class="@curPaintUsed">
                                current paint: @curPaintUsed 
                                <input type="text"
                                       list="paint-search"
                                       placeholder="Search from @allPaints.Count() paints!"
                                       @bind-value="@curPaintUsed" />
                                <datalist id="paint-search">
                                    @foreach (var paint in allPaints)
                                    {
                                        <option>@paint.PaintName</option>
                                    }
                                </datalist>
                            </div>
                        }
                        @if (!String.IsNullOrWhiteSpace(elem.Name))
                        {
                            <button type="button" @onclick="() => AddPaintToElement(elem)">
                                Add Paint To Element
                            </button>
                        }
                    </div>
                }

我粗略地检查了您的代码,但我相信以下内容会解决您的问题。按照下面的建议尝试,如果还是不行,我明天再解决。

  1. 按照之前的建议使用 InputText 组件。

  2. 这个 @foreach (var paintUsed in elem.PaintsUsed) 永远无法工作,因为您尝试使用 'foreach iteration variable.' 绑定到字符串集合而不是定义一个 class,我们称它为 PaintsUsedStrings, 像下面这样

    public class PaintsUsedStrings { public 字符串字符串值 { 得到;放; } }

并在您的 MiniElement class 中更改 属性

public List<String> PaintsUsed { get; set; } = new();

至:

public List<PaintsUsedStrings> PaintsUsed { get; set; } = new();

并将组件中的代码更改为如下内容:

 @foreach (var _paintsUsedStrings in elem.PaintsUsed)
    {
        current paint: @_paintsUsedStrings.StringValue 
        <InputText list="paint-search" placeholder="Search from <...> 
                                                             paints!"                                        
         @bind-Value="@_paintsUsedStrings.StringValue" />
      
    }

如您所见,我们绑定到字段变量,而不是迭代变量。我认为这应该可以解决绑定到集合的问题。