WPF: ViewModel.Clone()
От: Agent Smith Россия  
Дата: 19.07.11 12:20
Оценка:
Думаю, всем известно, что MemberwiseClone копирует ссылки, а не объекты, на которые они ссылаются. Поэтому если требуется "глубокое" копирование при реализации Clone() следует инициализировать соответствующие объекты.

Вот только при написании Clone() для ViewModel-ей легко забыть, что свойства типа ICommand ссылаются на делегаты и их тоже нужно инициализировать в Clone(). Иначе по нажатию кнопки обработчик будет вызываться в оригинальном объекте, а не в копии. И есть вероятность, что вы просидите час в отладчике, как и я, выискивая ошибки binding-а

19.07.11 22:19: Перенесено модератором из '.NET' — TK
Never argue with a woman who reads. It's likely she can also think. (c)
Re: WPF: ViewModel.Clone()
От: HowardLovekraft  
Дата: 19.07.11 12:35
Оценка:
Здравствуйте, Agent Smith, Вы писали:

AS>что свойства типа ICommand ссылаются на делегаты и их тоже нужно инициализировать в Clone()

Свойства типа ICommand ссылаются на реализации ICommand, которые не обазаны быть вариациями на тему DelegateCommand/RelayCommand.

AS>Вот только при написании Clone() для ViewModel-ей,

А зачем вам понадобилось клонировать view model'и?
Re[2]: WPF: ViewModel.Clone()
От: Agent Smith Россия  
Дата: 19.07.11 12:45
Оценка:
HL>Свойства типа ICommand ссылаются на реализации ICommand, которые не обазаны быть вариациями на тему DelegateCommand/RelayCommand.
Да, но очень часто являются

HL>А зачем вам понадобилось клонировать view model'и?

Ну, в данном случае был список, каждый элемент которого — ViewModel, внутри которой объект предметной области. Источником данных для списка является репозиторий, поддерживающий обновления с удаленного сервиса. По двойному клику открывалось диалоговое окно со свойствами Selected Item этого списка. В окне пользователь может изменить эту VM, после чего уходит команда на сервис и окно сразу же закрывается. Результатом работы сервиса является обновленный объект, на основе которого строится данная VM и который будет получен клиентом асинхронно через репозиторий. Собственно клонирование было нужно для того, чтобы объект в списке не менялся при изменении данной VM в диалоговом окне.
Never argue with a woman who reads. It's likely she can also think. (c)
Re[3]: WPF: ViewModel.Clone()
От: HowardLovekraft  
Дата: 19.07.11 14:06
Оценка:
Здравствуйте, Agent Smith, Вы писали:

AS>Собственно клонирование было нужно для того, чтобы объект в списке не менялся при изменении данной VM в диалоговом окне.


А как клонирование view model спасло от создания объекта в списке?
Клон — это же все равно новый объект, просто у него значения свойств схожи с оригиналом.

По-моему, логичнее, при поступлении от сервиса объекта предметной области, найти в репозитории его локальную копию, и обновить ее свойства. Как следствие, обновится его модель представления в списке. Это будет как минимум проще, чем клонирование.
Re[3]: WPF: ViewModel.Clone()
От: Codechanger Россия  
Дата: 19.07.11 14:12
Оценка:
Здравствуйте, Agent Smith, Вы писали:

HL>>Свойства типа ICommand ссылаются на реализации ICommand, которые не обазаны быть вариациями на тему DelegateCommand/RelayCommand.

AS>Да, но очень часто являются

HL>>А зачем вам понадобилось клонировать view model'и?

AS>Ну, в данном случае был список, каждый элемент которого — ViewModel, внутри которой объект предметной области. Источником данных для списка является репозиторий, поддерживающий обновления с удаленного сервиса. По двойному клику открывалось диалоговое окно со свойствами Selected Item этого списка. В окне пользователь может изменить эту VM, после чего уходит команда на сервис и окно сразу же закрывается. Результатом работы сервиса является обновленный объект, на основе которого строится данная VM и который будет получен клиентом асинхронно через репозиторий. Собственно клонирование было нужно для того, чтобы объект в списке не менялся при изменении данной VM в диалоговом окне.

Лучше делайте копии объектов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.