к массиву моих объектов ObservableCollection <MyClass> (MyClass имеет два публичных свойства), то как заставить данные обновляться? Пока что это происходит только тогда, когда я удаляю элементы массива, да и то частично - WPF не актуализирует данные элементов, а просто удаляет пропавшие и перерисовывает остальные на новые места. Там, вроде, надо реализовать INotifyPropertyChanged в моём классе, ну так я всё сделал, а толку ноль. Как заставить WPF понять, что надо refresh-нуть мои элементы?
мало реализовать, надо его еще и дергать при изменениях пропертей
Я это подразумевал.
ну покеж свой код
реализуй INotifyPropertyChanged в MyClass
? Я же сказал, что так и сделал.
покажи что ты сделал. не ясно же
public class MyClass : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string property_name = "") { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(property_name)); } } private int index; public int Index { get { return index; } set { NotifyPropertyChanged("Index"); index = value; } } public string Message { get; set; } public MyClass(string msg) { Message = msg; } }
Готово.
сделай так лучше: public class NotifyObject : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual bool RaisePropertyChanged<T>(ref T property, T newValue, [CallerMemberName] string propertyName = null) { if (Equals(property, newValue)) return false; property = newValue; OnPropertyChanged(propertyName); return true; } [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public class MyClass: NotifyObject { private int index; public int Index { get => index; set => RaisePropertyChanged(ref index, value); } } ну и тоже самое для твоей коллекции.
Какой моей коллекции?
ObservableCollection
Это же библиотечная.
ну и что у тебя своя реализация. тебе все равно надо реагировать на изменения
Это точно не то, о чём я говорил? https://t.me/professorweb/960917
в чём у тебя проблема ? что ты делаешь и что не выходит?
Ответ в моём первом сообщении по этой проблеме: https://t.me/professorweb/960914
Я это понял, я имею ввиду что делаешь и что надо обновлять? Ты Index меняешь или что ?
Меняю индекс, да.
И? Какие другие поля тебе надо обновить? В твоём примере же и нет других полей
Никаких других (пока) не надо.
Тогда что ты ожидаешь то? Чтобы что обновлялось?
Ох, наверное, я ужасно объясняю... Я удаляю из листбокса элементы с такого-то по такой-то и затем пересчитываю оставшимся индексы aka меняю свойство Index. Это изменение должно отразиться в листбоксе, но там как будто элементы закешированы, и WPF просто их перерисовал выше. Т.е. байндинг есть, но его как бы нет.
Вот, с этого и надо было начинать, то есть ты ты меняешь Index в коллекции у элементов. Как ты Это делаешь? Покажи код уже нормальный весь. Я по частичной информации не могу понять что ты делаешь же
чтобы отображались изменения в WPF - нужно подключать к изменяемым данным INotifyPropertyChanged
Неопытный я, думал, что всё нужное объяснил. Прямым присваиванием меняю. Вот сейчас написал так: for (int i = start_index; i < Items.Count; i++) { Items[i].Index = Items[i].Index - count; }
ты делаешь что-то не то. вот тебе пример. и всё работает
Спасибо! Мне, правда, кажется, что в MainViewModel.cs сеттер SomeItems никогда не будет вызван. В коде потом нет ни одного присваивания этому свойству.
Во-первых, сразу скажу, что у меня код не соответствует модели MVVM. Я вчера об этой штуке узнал. Во-вторых, если вернуться к обсуждению вот этого... Я задал по этому коду вопрос.
Я тебе пример же скинул.
Я по нему вопрос задал.
Мне кажется, что в MainViewModel.cs сеттер SomeItems никогда не будет вызван. В коде потом нет ни одного присваивания этому свойству. В чём я неправ? (Код же работает)
Это нужно чтобы уведомлять ui при измении коллекции, в данном случае она создаётся только при инициализации viewModel, но и бывают случаи когда управление идёт из другого viewModel или инициализации НЕ в конструкторе а при других действиях
Т.е. код примера не сломается, если этот сеттер вырезать?
Ну попробуй уже сам. По идеи не должен. Ты почему всё ещё не попробовал то
Старая версия Студии и Шарпа. 17 Студия на другом компе.
У меня такой черновик был написан вчера: "Я не понимаю, в чём принципиальное отличие моего кода от Вашего. Что написано в примере: сделаем обёртку для коллекции элементов типа SomeModel . С лишней абстракцией из командов, т.к. обработчики событий мы не хотим. Научим её бросать событие (с помощью класса NotifyObject), которое не используется дальше в логике. В XAMLе свяжем свойство ListBox со свойством обёртки, которое содержит ObservableCollection." Я решил не удалять.
Ошибка была в том, что я вызывал событие перед изменением значения.
Ошибка в том что нифига весь код не показываешь, а только куски не там где у тебя проблема. Как люди могут догадаться о проблеме если ты не представляешь полную информацию
Чекни сообщение, на которое я отвечаю. Там как раз лежит на видном месте ошибка.
Да не в этом дело. Я пока тебя не спросил вообще не было известно что ты там индексы перестраиваешь
Это да, согласен.
Обсуждают сегодня