WPF C#:SQL结果缓存至文本后ListBox/ComboBox显示异常
解决ListBox/ComboBox绑定文本文件内容时显示单个字符的问题
兄弟,我一眼就瞅出问题所在了!你现在把整个文本文件的字符串内容直接绑定给ListBox,但在C#里string默认实现了IEnumerable<char>——这就意味着ListBox会把字符串里的每个字符当成独立的列表项来渲染,难怪你看到每个姓名的单个字符占一行!
核心修复步骤
你需要把读取到的文本内容按行分割成字符串列表,再绑定到ListBox的ItemsSource,而不是直接绑定整个字符串。
修改你的Search_Click方法,替换原来的绑定逻辑:
private void Search_Click(object sender, RoutedEventArgs e) { if (!(_cache["cachecontents"] is List<string> patientNames)) { var policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0) }; var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); var filePath = path + "\\Razor Sharp Technology\\PharmaSYS Management Suite\\Files\\PatientNames.txt"; var filePaths = new List<string> { filePath }; policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths)); // 读取文本并按换行符分割成列表,同时过滤空行 var cacheContents = File.ReadAllText(filePath); patientNames = cacheContents.Split( new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries ).ToList(); _cache.Set("cachecontents", patientNames, policy); } // 直接把列表绑定到ListBox的ItemsSource LbFullName.ItemsSource = patientNames; MessageBox.Show(string.Join(Environment.NewLine, patientNames)); }
为什么这么改?
- 分割字符串为列表:
Split(Environment.NewLine)会把每行文本拆成单独的字符串元素,RemoveEmptyEntries能避免文本末尾的空行被当成无效项。 - 缓存优化:直接缓存处理后的
List<string>,而不是原始字符串,下次点击搜索时不需要重复分割,效率更高。 - 正确绑定数据源:ListBox的
ItemsSource接受集合类型(比如List<string>),这样每个元素对应一行姓名,就能正常显示了。
额外提示
你的XAML里ListBox的ItemsSource="{Binding}"可以保留,但如果直接在代码里赋值ItemsSource,效果是一样的。如果后续需要更复杂的显示模板,比如自定义每个列表项的样式,再添加DataTemplate即可。
内容的提问来源于stack exchange,提问作者RazorSharp
相关产品推荐
相关产品推荐

