如何在不覆盖旧项的情况下向DataGrid添加新项

本文关键字:情况下 DataGrid 添加 新项 覆盖 | 更新日期: 2023-09-27 17:58:57

我知道没有Append,但我相信这是正确的调用方式(对吗?)。

现在我有一个ObservableCollection,我用它向我的DataGrid添加新项目。它很好,但如果我一次添加10个项目,第二次添加15个项目,我最终会得到15个项目而不是25个。基本上,集合会覆盖旧集合上的每个集合。

可以循环浏览旧集合,并在包含新集合后再次添加它,但这似乎是一件非常愚蠢的事情。我相信必须有另一种方法来做到这一点。

下面是我的类和里面的集合的样子(我使用了这里的代码):

public class ProxiesList
{
    public string proxy { get; set; }
    public string proxySource { get; set; }
    public bool proxyUsed { get; set; }
    public bool toUse { get; set; }
    public string working { get; set; }
    ObservableCollection<ProxiesList> GridItems = new ObservableCollection<ProxiesList>();
    public ObservableCollection<ProxiesList> _GridItems
    {
        get
        {
            return GridItems;
        }
    }
    public void addTheData(MainWindow mw, List<string> proxyList)
    {
        foreach (string line in proxyList)
        {
            _GridItems.Add(new ProxiesList //add items to the collection
            {
                proxy = line.Split(';')[0],
                proxySource = line.Split(';')[1],
                proxyUsed = false,
                toUse = true,
                working = "n/a"
            });
        }
        mw.dataGrid1.ItemsSource = GridItems; //bind the collection to the dataGrid1
        GridItems = new ObservableCollection<ProxiesList>(); //create new instance of the observable collection
    }
}

如何在不覆盖旧项的情况下向DataGrid添加新项

ObservableCollection在添加、删除项目或刷新整个列表时提供通知。因此,您只需要将您的项目附加到数据网格绑定到的ObservableCollection<ProxiesList>的同一实例中。

因此,基本上,您可以将mw.dataGrid1.ItemsSource设置为ObservableCollection<ProxiesList>,也可以在Xaml中使用Binding

您不需要每次添加项目时都设置mw.dataGrid1.ItemsSource

GridItems = new ObservableCollection<ProxiesList>(); //create new instance of the observable collection

这一行导致了您的问题,因为它创建了集合的一个新实例,所以每次您将项目添加到ObservableCollection<ProxiesList>的新实例中时,这意味着它只包含您刚刚添加的项目。

因此,只需从public void addTheData(MainWindow mw, List<string> proxyList) 中删除以下行即可

    mw.dataGrid1.ItemsSource = GridItems; //bind the collection to the dataGrid1
    GridItems = new ObservableCollection<ProxiesList>(); //create new instance of the observable collection

如果将ProxiesList设置为DataContext,则可以将Xaml中的DataGrid.ItemsSource绑定到_GridItems属性。

其他事情,比如你的属性命名,最好遵循C#命名约定。

ObservableCollection内置了一种机制,每当项目添加到集合或从集合中删除时,都会通知UI(在本例中为DataGrid)。

因此,实例化ObservableCollection并设置DataGridItemsSource一次就足够了。例如,您可以在构造函数中执行此操作。剩下的就是简单地将新项目添加到现有集合中:

public ProxiesList()
{
    GridItems = new ObservableCollection<ProxiesList>();
    mw.dataGrid1.ItemsSource = GridItems;
}
public void addTheData(MainWindow mw, List<string> proxyList)
{
    foreach (string line in proxyList)
    {
        GridItems.Add(new ProxiesList //add items to the collection
        {
            proxy = line.Split(';')[0],
            proxySource = line.Split(';')[1],
            proxyUsed = false,
            toUse = true,
            working = "n/a"
        });
    }
}

我看不出在这里保留_GridItems的好处,所以你可以删除它。