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

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

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

42 ответов

23 просмотра

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

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

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

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

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

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
А можно вопрос? Мне сегодня сказали что у меня функция (которая просто заполняет массив значениями) не правильная void Full(double * arr, int n) { for (int i = 0; i < n; i...
† C E †
7
День добрый, подскажите пожалуйста, есть ли какой-то способ сказать ребару не компилировать определённое приложение? Всю доку их перечиатл ничего подобного не нашёл
Кирилл
14
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Всем привет. Возможно ли выполнить код ahk без интерпритатора? Имея только скомпилированный ехе файл? Например как функция eval
proxy
6
Карта сайта