2013-02-26 2 views
0

В моем хобби проекта У меня следующая ситуация:MVVM INotifyPropertyChanged в динамически измененных массивах

Я использую C#, WPF, MVVM (ну MVVM: попытаться)

я загрузить двоичный файл с информацией и сохраните его в списке (без знака) байтов. У меня есть иерархия классов, ссылающаяся на определенные местоположения в списке. Мое приложение иногда меняет иерархию классов (и ссылки на байты), но также иногда и байты (например, копирование диапазона).

У меня есть окна, в которых я привязал представление списка к отображаемой структуре.

При изменении свойств в классах я использую INotifyPropertyChanged, поскольку он должен использоваться в MVVM. Однако у меня возникают проблемы при непосредственном изменении байтов. В настоящее время я использую методы ручного обновления, но он становится очень грязным.

Есть ли какое-то решение для этого?

Также список байтов может быть как 45 МБ данных. Если бы я установил уведомление в списке, это означало бы, что для каждого байтового изменения я получаю уведомление обо всех наблюдателях? Значение, когда я буду копировать, например. 10 Кбайт байтов один за другим, и мне понадобилось бы 100 функций наблюдателя (изменение свойств обработки) в 1 миллион обновлений? Это будет убийцей производительности.

Или могу также сказать что-то вроде: теперь обновить класс X (т. Е. Все изменения свойств внутри класса). Я не могу использовать функцию set set, потому что значения уже были изменены при копировании байтов.

ответ

2

Если вы храните свои байты в списке (List<byte>), тогда вы можете просто изменить тип списка на ObservableCollection<byte>, и ваш код будет работать без каких-либо изменений. Затем вы можете избавиться от ручных обновлений.

Но если вы храните данные в массиве байтов (byte[]), то лучший вариант - изменить его на ObservableCollection<byte>, но вам, возможно, придется изменить некоторые ваши коды, используя colletion.

Если у вас есть особые случаи для обработки, другой вариант может заключаться в создании вашей собственной структуры данных, реализующей INotifyPropertyChanged и INotifyCollectionChanged. Но это много кода для написания.

+0

Последний способ кажется лучшим; somethign похоже, как я использую сейчас, я думаю (но получить беспорядок легко). –

2

Вы можете сделать свою привязку к ObservableCollection<T>.

+0

Вы имеете в виду полный список байтов? Это были бы все предметы ... не уверен, что это будет хорошая идея. Это означает обновление всех классов и всех свойств. –

Смежные вопросы