Wpf 如何在绑定列表的现有项已更新时更新ListView

Wpf 如何在绑定列表的现有项已更新时更新ListView,wpf,Wpf,当进度发生变化时,我需要更新下载列表 XAML: 我可以用另一个控件或面板替换弹出窗口,但我需要它可能超出主窗口的边界(如屏幕上)。但我相信WPF有另一种方法来更新ListView的内容(不闪烁) PS:很抱歉问了这么长的问题,但我不知道如何更简单地描述它…我认为这一行不起作用的原因是: RaisePropertyChanged("UiList"); 是因为你没有改变名单。您清除了它并重新填充了它,但它仍然是对同一列表的引用。我很想知道,如果你没有清除列表并重新填充,而是创建了一个新的列表,

当进度发生变化时,我需要更新下载列表

XAML:

我可以用另一个控件或面板替换弹出窗口,但我需要它可能超出主窗口的边界(如屏幕上)。但我相信WPF有另一种方法来更新ListView的内容(不闪烁)

PS:很抱歉问了这么长的问题,但我不知道如何更简单地描述它…

我认为这一行不起作用的原因是:

RaisePropertyChanged("UiList"); 

是因为你没有改变名单。您清除了它并重新填充了它,但它仍然是对同一列表的引用。我很想知道,如果你没有清除列表并重新填充,而是创建了一个新的列表,会发生什么。我认为应该按照您的预期更新您的ListView。我不知道它是否对您的弹出窗口有影响。

我在这里找到了答案:

可观测收集是部分解决方案。ObservableCollection仅在集合更改(添加、删除的项等)时引发CollectionChanged事件为支持现有项的更新,集合内的每个对象(在我的示例中是模型类)必须实现INotifyPropertyChanged接口

// I used this parent (ViewModelBase) for quick testing because it implements INotifyPropertyChanged
public class Model : ViewModelBase 
{
    private int _progress;
    public int Progress
    {
        get { return _progress; }
        set
        {
            _progress = value;
            RaisePropertyChanged("Progress");
        }
    }

    public string Title { get; set; }
}

是的,创建一个新的列表给了我一个新的方法(顺便说一句,谢谢!)来修复listview更新。但它不能解决弹出问题…您应该将列表更改为ObservableCollection。
public class Logic
{
    readonly List<Model> _list = new List<Model>();
    public event EventHandler Update;

    public List<Model> List
    {
        get { return _list; }
    }

    public void Start()
    {
        for (int i = 0; i < 100; i++)
        {
            _list.Clear();
            _list.Add(new Model{Progress = i, Title = "title1"});
            _list.Add(new Model { Progress = i, Title = "title2" });

            var time = DateTime.Now.AddSeconds(2);
            while (time > DateTime.Now)
            { }

            Update(this, EventArgs.Empty);
        }
    }
}
<Popup Name="Menu" StaysOpen="False">
RaisePropertyChanged("UiList"); 
// I used this parent (ViewModelBase) for quick testing because it implements INotifyPropertyChanged
public class Model : ViewModelBase 
{
    private int _progress;
    public int Progress
    {
        get { return _progress; }
        set
        {
            _progress = value;
            RaisePropertyChanged("Progress");
        }
    }

    public string Title { get; set; }
}