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

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

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

42 ответов

17 просмотров

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

реализуй 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
Чекни сообщение, на которое я отвечаю. Там как раз...

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

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта