如何为绑定Newtonsoft JToken列表的.NET ListBox设置DisplayMember
问题原因
DisplayMember属性需要传入的是绑定数据源中每个元素要展示的属性名称,而非属性的实际值。你当前的代码是取出了第一个JToken元素的name字段值作为DisplayMember,等于让ListBox去每个JToken对象上找和这个值同名的属性,自然找不到对应的内容。
此外JToken属于动态JSON对象,其字段不是.NET类的常规属性,就算你直接把DisplayMember设为字符串"name",默认的数据绑定逻辑也无法直接读取到对应的字段值。
正确实现方式
有两种常用的实现方案:
方案1:使用Format事件自定义展示内容(无需修改数据源)
直接绑定原List<JToken>集合,通过订阅ListBox的Format事件,手动指定每个条目的展示内容:
List<JToken> gCollectionRequests = new List<JToken>(); // 原有创建gCollectionRequests的代码不变 listBox1.DataSource = gCollectionRequests; // 订阅Format事件处理展示逻辑 listBox1.Format += (sender, e) => { if (e.ListItem is JToken token) { e.Value = token["name"]?.ToString() ?? string.Empty; } };
方案2:转换为强类型集合后绑定(更易维护)
先定义和Postman请求结构对应的强类型类,把JToken集合转成强类型集合后再绑定,后续操作更方便:
- 定义实体类
public class PostmanRequestItem { public string Name { get; set; } // 可根据需要补充其他需要用到的字段 }
- 转换集合并绑定
var bindList = gCollectionRequests.Select(token => new PostmanRequestItem { Name = token["name"]?.Value<string>() ?? string.Empty }).ToList(); listBox1.DataSource = bindList; listBox1.DisplayMember = nameof(PostmanRequestItem.Name);
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

