您必须使用正确的数据绑定技术,然后这就会自动工作。
必需的...
- 在 ObservableCollection 内的类上实现 INotifyPropertyChanged (并确保在该类上设置属性时触发该事件)
- 在 ListView 的 ItemTemplate 上,确保使用绑定到属性
如果您执行这两件事,则无需“刷新”调用或其他任何操作。设置触发 INotifyPropertyChanged 的属性将导致 ItemTemplate 的 Binding 更新。
在 ObservableCollection 内的类上实现 INotifyPropertyChanged...(如果您还不知道 BindableBase 类,请查找它)
public class ToDoItem : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _name;
public string Name
{
get { return _name; }
set { SetProperty(ref _name, value); }
}
private DateTime _date;
public DateTime Date
{
get { return _date; }
set { SetProperty(ref _date, value); }
}
protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
{
if (object.Equals(storage, value)) return false;
storage = value;
this.OnPropertyChanged(propertyName);
return true;
}
protected void OnPropertyChanged(string propertyName)
{
var eventHandler = this.PropertyChanged;
if (eventHandler != null)
{
eventHandler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
您的列表视图
<ListView
x:Name="listView">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock
Text="{Binding Name}"/>
<TextBlock
Text="{Binding Date}"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
您的可观察集合...
private ObservableCollection<ToDoItem> _toDoItems = new ObservableCollection<ToDoItem>();
// Assign the collection to the ListView
listView.ItemsSource = _toDoItems;
将东西添加到集合作品中...
_toDoItems.Add(new ToDoItem()
{
Name = "Item " + (_toDoItems.Count + 1),
Date = DateTime.Now
});
更新,你所要求的,有效......
ToDoItem item = _toDoItems[randomIndex];
item.Name = "Updated " + item.Name;
item.Date = DateTime.Now;
无需调用“刷新”或其他任何需要的内容。项目本身会更新,但列表不会更改。
在更新第 4 条之前...
更新第 4 项后...
完整代码示例可在此处获取: 代码示例