ListBox未通过DataSource更新

时间:2017-01-08 19:30:40

标签: c# .net winforms listbox datasource

我有一个ListBox,其DataSource设置为BindingList。

BindingList<PairDiff> pairList = new BindingList<PairDiff>();
pairList.RaiseListChangedEvents = true;
listBox1.DataSource = pairList;

当其中一个成员更新时,BindingList的类型实现并引发INotifyPropertyChanged

当现有项目中的某些数据发生更改时,ListBox仍然不会更新它的显示。仅在更改或删除项目时。

当我调试到listBox.Items集合时,新数据就在那里。它只是没有显示!

ListBox中显示的是PairDiffs ToString方法。

编辑:

public class PairDiff : INotifyPropertyChanged
{
    public Pair pair;
    public double diff;

    public event PropertyChangedEventHandler PropertyChanged;

    public void UpdateDiff(double d) // this is called to update the data in the list
    {
        diff = d;
        PropertyChanged(this, new PropertyChangedEventArgs("diff"));
    }

    public override string ToString() // this is displayed in the list
    {
        return pair + " " + diff;
    }
}

更新列表框中的数据:

    public void UpdateData(Pair pair, double d)
    {
        var pd = pairList.First((x) => x.pair == pair);
        pd.UpdateDiff( d );
    }

2 个答案:

答案 0 :(得分:1)

问题是列表框正在缓存它的值。最简单的解决方案是捕获ListChanged-Event并在其中重绘Listbox:

private void Items_ListChanged(object sender, ListChangedEventArgs e)
{
    listbox.Invalidate(); //Force the control to redraw when any elements change
}

我指的是article

答案 1 :(得分:0)

FWIW我终于找到了这个问题及其典型的winforms线程问题:

将我的列表框的更新放在InvokeRequired块中解决它:

public void UpdateData(Pair pair, double d)
{
        Action action = () =>
        {
            var pd = pairList.First((x) => x.pair == pair);
            pd.UpdateDiff(d);
        };


        if (listBox1.InvokeRequired)
        {
            listBox1.Invoke(action);
        }
        else
        {
            action();
        }
}