Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Биндинги
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. У меня не работает обновление данных из собственно данных в контрол. Для того, чтобы данные обновлялись советуют использовать INotifyCollectionChanged, INotifyPropertyChanged или ObservableCollection, который уже их реализует. Использую ObservableCollection, обновления данных нет, но сам биндинг как бы работает. Прилагаю тестовый проект. Меняя #define в ViewModel можно подгружать данные синхронно, либо асинхронно. В первом случае биндинг подгружает данные, потому что они доступны сразу. Во втором случае он тоже подгружает данные, но на момент привязки данные пустые. А когда данные обновляются, изменения не отражаются в контроле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2010, 12:42 |
|
||
|
Биндинги
|
|||
|---|---|---|---|
|
#18+
enigmatic, ObservableCollection реализует INotifyCollectionChanged для изменений в самой коллекции, и ничего не знает о ViewModel.Model. Тут два пути: 1) в конструкторе создавать пустую ObservableCollection (Model = new ItemList();) и в обработчике service_DataLoaded запихивать туда элементы (foreach (var item in e.list) Model.Add(item);) - тогда отработает нотификация ObservableCollection 2) реализовать INotifyPropertyChanged для ViewModel, и в обработчике service_DataLoaded извещать об изменении свойства Model (this.Model = e.list; OnPropertyChanged("Model");) вероятно 2) предпочтительней (мало ли для каких еще свойств понадобится нотифицировать об изменениях) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2010, 13:35 |
|
||
|
Биндинги
|
|||
|---|---|---|---|
|
#18+
LRвероятно 2) предпочтительней (мало ли для каких еще свойств понадобится нотифицировать об изменениях) Вряд ли. Как говорят, нужен велосипед, - а предлагают танк. "Ну мало ли - стрелять ещё придётся..." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2010, 13:39 |
|
||
|
Биндинги
|
|||
|---|---|---|---|
|
#18+
МСУВряд ли. в 1) случае перегонять из одной коллекции в другую - уже некрасиво, да и нотификаций будет столько же сколько элементов - против одной во 2-м случае - неэффективно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2010, 13:44 |
|
||
|
Биндинги
|
|||
|---|---|---|---|
|
#18+
LR, ну "перегонять" я обычно автоматизирую с помощью экстеншена: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Итого, получаем компакный набор букаф в одну строчку: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2010, 14:17 |
|
||
|
Биндинги
|
|||
|---|---|---|---|
|
#18+
LRenigmatic, ObservableCollection реализует INotifyCollectionChanged для изменений в самой коллекции, и ничего не знает о ViewModel.Model. Тут два пути: 1) в конструкторе создавать пустую ObservableCollection (Model = new ItemList();) и в обработчике service_DataLoaded запихивать туда элементы (foreach (var item in e.list) Model.Add(item);) - тогда отработает нотификация ObservableCollection 2) реализовать INotifyPropertyChanged для ViewModel, и в обработчике service_DataLoaded извещать об изменении свойства Model (this.Model = e.list; OnPropertyChanged("Model");) вероятно 2) предпочтительней (мало ли для каких еще свойств понадобится нотифицировать об изменениях) 2-й вариант то, что нужно, т.к. модель будет меняться целиком, а не будут добавляться/удаляться итемы из нее. Думал, как это сделать с помощью INotifyCollectionChanged для ItemList. А INotifyPropertyChanged для ViewModel как раз то, что нужно. Действительно работает. Но почему оно работает? Почему мы вызываем OnPropertyChanged в service_DataLoaded? Почему не в сеттере модели, как это делается в примерах по INotifyPropertyChanged: Код: plaintext 1. 2. 3. 4. 5. 6. Я полный нуб, да. Заранее благодарю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2010, 15:44 |
|
||
|
Биндинги
|
|||
|---|---|---|---|
|
#18+
enigmaticПочему мы вызываем OnPropertyChanged в service_DataLoaded? Почему не в сеттере модели, как это делается в примерах по INotifyPropertyChanged: ну конечно правильней в сеттере свойства, " и в обработчике service_DataLoaded извещать об изменении свойства Model " - это я для проверки так пробовал, в спешке и ляпнул... о бесконечном цикле не понял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2010, 15:58 |
|
||
|
Биндинги
|
|||
|---|---|---|---|
|
#18+
enigmatic Код: plaintext 1. 2. 3. 4. 5. 6. Извиняюсь, чушь написал. enigmaticНо почему оно работает? A change-notification handler notifies a binding target that a change has been made. This enables a target to automatically respond to changes. Все, понял. Оповещаем ведь цель привязки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2010, 15:59 |
|
||
|
Биндинги
|
|||
|---|---|---|---|
|
#18+
enigmatic Код: plaintext 1. 2. 3. 4. 5. 6. а, теперь понял про цикл )))) заведите переменную private ItemList _model ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2010, 16:00 |
|
||
|
Биндинги
|
|||
|---|---|---|---|
|
#18+
LRenigmaticПочему мы вызываем OnPropertyChanged в service_DataLoaded? Почему не в сеттере модели, как это делается в примерах по INotifyPropertyChanged: ну конечно правильней в сеттере свойства, " и в обработчике service_DataLoaded извещать об изменении свойства Model " - это я для проверки так пробовал, в спешке и ляпнул... о бесконечном цикле не понял... Значит с сеттером свойства все верно. Хорошо. А бесконечный цикл там получается из-за того, что нет поля для свойства Model. Вот оно и гоняет себя в цикле: Код: plaintext 1. 2. 3. LR, спасибо за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2010, 16:04 |
|
||
|
Биндинги
|
|||
|---|---|---|---|
|
#18+
enigmaticЗдравствуйте. У меня не работает обновление данных из собственно данных в контрол. Для того, чтобы данные обновлялись советуют использовать INotifyCollectionChanged, INotifyPropertyChanged или ObservableCollection, который уже их реализует. Использую ObservableCollection, обновления данных нет, но сам биндинг как бы работает. Прилагаю тестовый проект. Меняя #define в ViewModel можно подгружать данные синхронно, либо асинхронно. В первом случае биндинг подгружает данные, потому что они доступны сразу. Во втором случае он тоже подгружает данные, но на момент привязки данные пустые. А когда данные обновляются, изменения не отражаются в контроле. В SL есть баг с утечкой для списка и DataGrid(радуйся, MCУ). Работает такой вариант: Если существующий список _list== null, то присваеваем ему значение полученного списка, иначе: осуществляем его очистку_list.Clear(); копируем элементы полученного списка в существующий( foreach(var item in value) _list.Add(item); ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2010, 18:36 |
|
||
|
Биндинги
|
|||
|---|---|---|---|
|
#18+
iВ SL есть баг с утечкой для списка и DataGrid(радуйся, MCУ). Работает такой вариант: Если существующий список _list== null, то присваеваем ему значение полученного списка, иначе: осуществляем его очистку_list.Clear(); копируем элементы полученного списка в существующий( foreach(var item in value) _list.Add(item); ) Можно поподробнее про то как это устранить в данном случае и про эту конкретную утечку? Гугл выдает по запросу "memory leak listbox silverlight", но только по скроллингу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2010, 10:38 |
|
||
|
|

start [/forum/topic.php?fid=21&msg=37042133&tid=1442527]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 368ms |

| 0 / 0 |
