看到我所有的ListView项目,一个接一个地添加,而不是所有的在最后

本文关键字:一个 最后 添加 项目 ListView | 更新日期: 2023-09-27 18:16:44

所以我有这个集合:

Dictionary<string, int> dictionary;
ObservableCollection<MyItem> list = new ObservableCollection<MyItem>();
public class MyItem
{
    public string IP { get; set; }
    public int Packets { get; set; }
    public decimal Percent { get; set; }
}

在这里我填充我的ListView:

   foreach (KeyValuePair<string, int> item in dictionary.OrderByDescending(value => value.Value))
    {
        double value = ((double)item.Value / someValue) * 100;
        MyItem myItem = new MyItem { IP = item.Key, Packets = item.Value, Percent = value };
        list.Add(myItem);
        listView.ItemsSource = list;
    }

所以我想要的是看到我的项目一个接一个地添加,目前的状态是,我只能在最后看到我的ListView与所有项目一次

看到我所有的ListView项目,一个接一个地添加,而不是所有的在最后

这是预期的行为:当你设置ItemSource与ObservableCollection或如果你设置ObservableCollection属性后,你添加了你的项目。

要达到预期的效果,必须在添加项之前设置项源。

理想的情况是将ItemSource绑定到你的ObservableCollection上,然后在你的视图模型中填充你的observable collection。

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
namespace StackOverflow2
{
public partial class MainWindow : Window
{
    readonly Dictionary<string, int> _dictionary;
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        List = new ObservableCollection<MyItem>();
        _dictionary = new Dictionary<string, int>();
        //bogus initial dictionary fill
        for (int i = 0; i < 2000; i++)
        {
            _dictionary.Add("Key_"+i,i+1);
        }
    }
    private int someValue = 10;
    public void Fillcollection()
    {
        Task.Factory.StartNew(() =>
        {
            foreach (KeyValuePair<string, int> item in _dictionary.OrderByDescending(value => value.Value))
            {
                decimal value = ((decimal)item.Value / someValue) * 100;
                MyItem myItem = new MyItem { IP = item.Key, Packets = item.Value, Percent = value };
                this.Dispatcher.Invoke(()=>List.Insert(0,myItem));
                Thread.Sleep(50);
            }
        });
    }
    public ObservableCollection<MyItem> List { get; set; }
    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        Fillcollection();
    }
}
public class MyItem
{
    public string IP { get; set; }
    public int Packets { get; set; }
    public decimal Percent { get; set; }
}

}

<Window x:Class="StackOverflow2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:StackOverflow2"
    mc:Ignorable="d"
    d:DataContext="{d:DesignInstance {x:Type local:MainWindow}}"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Button Content="FillCollection" Click="ButtonBase_OnClick" ></Button>
    <DataGrid ItemsSource="{Binding List}" Grid.Column="1" AutoGenerateColumns="True"></DataGrid>
</Grid>
</Window>