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