170 похожих чатов

Скажите пожалуйста, если у меня есть привязка ListBox-а с DataTemplate

к массиву моих объектов ObservableCollection <MyClass> (MyClass имеет два публичных свойства), то как заставить данные обновляться? Пока что это происходит только тогда, когда я удаляю элементы массива, да и то частично - WPF не актуализирует данные элементов, а просто удаляет пропавшие и перерисовывает остальные на новые места. Там, вроде, надо реализовать INotifyPropertyChanged в моём классе, ну так я всё сделал, а толку ноль. Как заставить WPF понять, что надо refresh-нуть мои элементы?

42 ответов

26 просмотров

мало реализовать, надо его еще и дергать при изменениях пропертей

реализуй INotifyPropertyChanged в MyClass

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
реализуй INotifyPropertyChanged в MyClass

? Я же сказал, что так и сделал.

Nickolay Garbuzov
? Я же сказал, что так и сделал.

покажи что ты сделал. не ясно же

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
покажи что ты сделал. не ясно же

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; } }

Nickolay-Garbuzov Автор вопроса
Nickolay Garbuzov
public class MyClass : INotifyPropertyChanged { ...

сделай так лучше: 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); } } ну и тоже самое для твоей коллекции.

Nickolay-Garbuzov Автор вопроса
Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
ObservableCollection

Это же библиотечная.

Nickolay Garbuzov
Это же библиотечная.

ну и что у тебя своя реализация. тебе все равно надо реагировать на изменения

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
ну и что у тебя своя реализация. тебе все равно на...

Это точно не то, о чём я говорил? https://t.me/professorweb/960917

Nickolay Garbuzov
Это точно не то, о чём я говорил? https://t.me/pro...

в чём у тебя проблема ? что ты делаешь и что не выходит?

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
в чём у тебя проблема ? что ты делаешь и что не вы...

Ответ в моём первом сообщении по этой проблеме: https://t.me/professorweb/960914

Nickolay Garbuzov
Ответ в моём первом сообщении по этой проблеме: ht...

Я это понял, я имею ввиду что делаешь и что надо обновлять? Ты Index меняешь или что ?

Nickolay Garbuzov
Меняю индекс, да.

И? Какие другие поля тебе надо обновить? В твоём примере же и нет других полей

Nickolay-Garbuzov Автор вопроса
Nickolay Garbuzov
Никаких других (пока) не надо.

Тогда что ты ожидаешь то? Чтобы что обновлялось?

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
Тогда что ты ожидаешь то? Чтобы что обновлялось?

Ох, наверное, я ужасно объясняю... Я удаляю из листбокса элементы с такого-то по такой-то и затем пересчитываю оставшимся индексы aka меняю свойство Index. Это изменение должно отразиться в листбоксе, но там как будто элементы закешированы, и WPF просто их перерисовал выше. Т.е. байндинг есть, но его как бы нет.

Nickolay Garbuzov
Ох, наверное, я ужасно объясняю... Я удаляю из лис...

Вот, с этого и надо было начинать, то есть ты ты меняешь Index в коллекции у элементов. Как ты Это делаешь? Покажи код уже нормальный весь. Я по частичной информации не могу понять что ты делаешь же

Nickolay Garbuzov
Ох, наверное, я ужасно объясняю... Я удаляю из лис...

чтобы отображались изменения в WPF - нужно подключать к изменяемым данным INotifyPropertyChanged

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
Вот, с этого и надо было начинать, то есть ты ты м...

Неопытный я, думал, что всё нужное объяснил. Прямым присваиванием меняю. Вот сейчас написал так: for (int i = start_index; i < Items.Count; i++) { Items[i].Index = Items[i].Index - count; }

Nickolay Garbuzov
Неопытный я, думал, что всё нужное объяснил. Прямы...

ты делаешь что-то не то. вот тебе пример. и всё работает

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
ты делаешь что-то не то. вот тебе пример. и всё ра...

Спасибо! Мне, правда, кажется, что в MainViewModel.cs сеттер SomeItems никогда не будет вызван. В коде потом нет ни одного присваивания этому свойству.

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
ты делаешь что-то не то. вот тебе пример. и всё ра...

Во-первых, сразу скажу, что у меня код не соответствует модели MVVM. Я вчера об этой штуке узнал. Во-вторых, если вернуться к обсуждению вот этого... Я задал по этому коду вопрос.

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
Я тебе пример же скинул.

Я по нему вопрос задал.

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
Какой?

Мне кажется, что в MainViewModel.cs сеттер SomeItems никогда не будет вызван. В коде потом нет ни одного присваивания этому свойству. В чём я неправ? (Код же работает)

Nickolay Garbuzov
Мне кажется, что в MainViewModel.cs сеттер SomeIte...

Это нужно чтобы уведомлять ui при измении коллекции, в данном случае она создаётся только при инициализации viewModel, но и бывают случаи когда управление идёт из другого viewModel или инициализации НЕ в конструкторе а при других действиях

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
Это нужно чтобы уведомлять ui при измении коллекци...

Т.е. код примера не сломается, если этот сеттер вырезать?

Nickolay Garbuzov
Т.е. код примера не сломается, если этот сеттер вы...

Ну попробуй уже сам. По идеи не должен. Ты почему всё ещё не попробовал то

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
Ну попробуй уже сам. По идеи не должен. Ты почему ...

Старая версия Студии и Шарпа. 17 Студия на другом компе.

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
Ну попробуй уже сам. По идеи не должен. Ты почему ...

У меня такой черновик был написан вчера: "Я не понимаю, в чём принципиальное отличие моего кода от Вашего. Что написано в примере: сделаем обёртку для коллекции элементов типа SomeModel . С лишней абстракцией из командов, т.к. обработчики событий мы не хотим. Научим её бросать событие (с помощью класса NotifyObject), которое не используется дальше в логике. В XAMLе свяжем свойство ListBox со свойством обёртки, которое содержит ObservableCollection." Я решил не удалять.

Nickolay-Garbuzov Автор вопроса
Nickolay Garbuzov
public class MyClass : INotifyPropertyChanged { ...

Ошибка была в том, что я вызывал событие перед изменением значения.

Nickolay Garbuzov
Ошибка была в том, что я вызывал событие перед изм...

Ошибка в том что нифига весь код не показываешь, а только куски не там где у тебя проблема. Как люди могут догадаться о проблеме если ты не представляешь полную информацию

Nickolay-Garbuzov Автор вопроса
Ilya Khudaev
Ошибка в том что нифига весь код не показываешь, а...

Чекни сообщение, на которое я отвечаю. Там как раз лежит на видном месте ошибка.

Nickolay Garbuzov
Чекни сообщение, на которое я отвечаю. Там как раз...

Да не в этом дело. Я пока тебя не спросил вообще не было известно что ты там индексы перестраиваешь

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта