You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让ListView内嵌的ComboBox正确绑定显示JSON中的pairs数据

XAML代码

<ListView Name="ListPairOption">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="data:PairClass">
            <StackPanel x:Name="pilganStack">
                <WebView
                    x:Name="option"
                    local:MyProperties.HtmlString="{Binding Name}"/>
            </StackPanel>
            <ComboBox
                x:Name="pairOption"
                DisplayMemberPath="NameA"
                SelectedValue="{Binding ComboBoxClass, Mode=TwoWay}"
                ItemsSource="{x:Bind PilihanS}"
                PlaceholderText="Pilih" />
</ListView>

原有C#业务代码

try
{   
    JsonObject jsonObject = JsonObject.Parse(jsonText);
    JsonObject questionObject = jsonObject["EXAM_QUESTION"].GetObject();
    ObservableCollection<PairClass> itemL = new ObservableCollection<PairClass>();
    JsonArray mapArray = questionObject["map"].GetArray();
    foreach (JsonValue mapValue in mapArray)
    {
        JsonArray mapArrayI = mapValue.GetArray();
        PairClass pair = new PairClass();
        foreach (JsonValue mapValueI in mapArrayI)
        {
            try
            {
                string v = mapValueI.ToString();
                pair.Name = v;
            }
        }
        itemL.Add(pair);
    }   
    JsonArray pairArray = questionObject["pairs"].GetArray();
    string pairString = "";
    foreach (JsonValue pairValue in pairArray)
    {
        JsonArray pairArrayI = pairValue.GetArray();
        List<ComboBoxClass> PilihanS = new List<ComboBoxClass>();
        foreach (JsonValue pairValueI in pairArrayI)
        {
            try
            {
                var collection = Regex.Matches(v, "\\\"(.*?)\\\"");
                foreach (var item in collection)
                {
                    string v3 = item.ToString().Trim('"');
                    pairString = v3;
                }
            }
        }
        PilihanS.Add(new ComboBoxClass() { NameA = pairString });
    }
    ListPairOption.ItemsSource = itemL;
}

原有实体类定义

public class PairClass
{
    public string Name { get; set; }
    public ObservableCollection<ComboBoxClass> PilihanS { get; set; }

    public PairClass(string name)
    {
        Name = name;
    }
}

public class ComboBoxClass
{
    public string NameA { get; set; }

    public override string ToString()
    {
        return this.NameA;
    }
}

当前运行效果

ComboBox为空效果

修改方案

核心问题说明

  1. PairClass的PilihanS属性未初始化,默认值为null,ComboBox绑定空数据源自然无显示
  2. 解析得到的pairs选项是局部变量,没有关联到PairClass实例的PilihanS属性
  3. 变量作用域错误:解析pairs时调用的v是map解析循环的局部变量,跨作用域访问报错
  4. 解析逻辑冗余:不需要用正则提取JSON值,JsonArray本身支持直接取值
  5. 构造函数不匹配:PairClass只定义了带参构造,代码中却调用无参构造初始化,存在编译错误

完整修改代码

1. 修正实体类

public class PairClass
{
    public string Name { get; set; }
    // 初始化属性避免绑定空值
    public ObservableCollection<ComboBoxClass> PilihanS { get; set; } = new ObservableCollection<ComboBoxClass>();
    // 新增选中项属性对应ComboBox的选中绑定
    public ComboBoxClass SelectedOption { get; set; }
    // 补充无参构造
    public PairClass(){}
    public PairClass(string name)
    {
        Name = name;
    }
}

public class ComboBoxClass
{
    public string NameA { get; set; }

    public override string ToString()
    {
        return this.NameA;
    }
}

2. 修正业务逻辑代码

try
{   
    JsonObject jsonObject = JsonObject.Parse(jsonText);
    JsonObject questionObject = jsonObject["EXAM_QUESTION"].GetObject();
    ObservableCollection<PairClass> itemL = new ObservableCollection<PairClass>();
    
    // 先统一解析pairs公共选项
    List<ComboBoxClass> commonOptions = new List<ComboBoxClass>();
    JsonArray pairArray = questionObject["pairs"].GetArray();
    foreach (JsonValue pairVal in pairArray)
    {
        // 直接读取JSON字符串值,无需正则处理
        string optionText = pairVal.GetString();
        commonOptions.Add(new ComboBoxClass { NameA = optionText });
    }

    // 解析map数组,同时关联选项
    JsonArray mapArray = questionObject["map"].GetArray();
    foreach (JsonValue mapVal in mapArray)
    {
        JsonArray innerMapArr = mapVal.GetArray();
        PairClass pairItem = new PairClass();
        foreach (JsonValue innerMapVal in innerMapArr)
        {
            pairItem.Name = innerMapVal.GetString();
            // 给当前Item绑定选项
            foreach(var opt in commonOptions)
            {
                pairItem.PilihanS.Add(opt);
            }
        }
        itemL.Add(pairItem);
    }
    ListPairOption.ItemsSource = itemL;
}
catch (Exception ex)
{
    // 异常捕获方便排查问题
    System.Diagnostics.Debug.WriteLine($"加载错误:{ex.Message}");
}

3. 修正XAML绑定

<ComboBox
    x:Name="pairOption"
    DisplayMemberPath="NameA"
    SelectedValue="{Binding SelectedOption, Mode=TwoWay}"
    ItemsSource="{x:Bind PilihanS, Mode=OneWay}"
    PlaceholderText="Pilih" />

内容的提问来源于stack exchange,提问作者Rose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:15:02