看到我所有的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
与所有项目一次
这是预期的行为:当你设置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>