首页 > 解决方案 > WPF ListBox 不显示项目(一项一项)

问题描述

我有一长串单词。我检查单词出现了多少次,然后将其添加到 ObservableCollection。由于它是一个长列表并且迭代需要相当长的时间,我希望能够显示该单词每次迭代后继续下一次。目前,在整个集合的迭代完成后,单词将一起显示。

调试时,我注意到当我向 oWords 添加一个值但未显示该值时,列表框(wordBox)已更新。

Exercise4_btn.Click += async (object sender, RoutedEventArgs e) =>
        {
            oWords = new ObservableCollection<Word>();
            List<string> words = await GetWordsFromFile();

            wordBox.DataContext = oWords;
            wordBox.SetBinding(ListBox.ItemsSourceProperty, new Binding()); 

            foreach (var word in words)
            {
                await Task.Run(() =>
                {
                    int count = words.Where(w => w.Equals(word)).Count();

                    try
                    {
                        oWords.Add(new Word {Value = word, Count = count});
                    }
                    catch { }
                });
            }
        };

这是列表框在 xaml 中的外观

<ListBox Name="wordBox" HorizontalAlignment="Left" Height="612" Margin="460,53,0,0" VerticalAlignment="Top" Width="278"/>

这是 ObservableCollection 使用的类

public class Word
{
    public string Value { get; set; }
    public int Count { get; set; }

    public override string ToString()
    {
        return ($"{Value}\t{Count}");
    }
}

标签: c#wpfxaml

解决方案


Coops 提供的评论中的链接对我有用 使用 WPF Dispatcher 和 TPL 更新 UI

我还发现了另一个类似的解决方案异步添加到 ObservableCollection


推荐阅读