Вы должны использовать правильные методы привязки данных, и тогда это будет работать автоматически.
Обязательно ...
- Реализуйте INotifyPropertyChanged для вашего класса внутри ObservableCollection (и убедитесь, чтовы запускаете событие, когда устанавливаете свойства для этого класса)
- На ItemTemplate вашего ListView убедитесь, что вы используете привязку к свойствам
Если вы делаете эти двавещи, нет необходимости в вызове «Обновить» или что-то еще.Установка свойства, запускающего INotifyPropertyChanged, приведет к обновлению привязки ItemTemplate.
Реализация INotifyPropertyChanged для вашего класса в ObservableCollection ... (посмотрите на класс 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
<ListView
x:Name="listView">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock
Text="{Binding Name}"/>
<TextBlock
Text="{Binding Date}"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Ваша коллекция ObservableCollection ...
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 ...
После обновления Item 4 ...
Полный образец кода доступен здесь: CODEОБРАЗЕЦ