如何让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; } }
当前运行效果
修改方案
核心问题说明
PairClass的PilihanS属性未初始化,默认值为null,ComboBox绑定空数据源自然无显示- 解析得到的pairs选项是局部变量,没有关联到
PairClass实例的PilihanS属性 - 变量作用域错误:解析pairs时调用的
v是map解析循环的局部变量,跨作用域访问报错 - 解析逻辑冗余:不需要用正则提取JSON值,JsonArray本身支持直接取值
- 构造函数不匹配:
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
相关产品推荐
相关产品推荐

