2012-05-04 4 views
0

Я работаю над проектом WPF и реализовал очень простой способ отменить один уровень изменений, который хорошо работает во всем проекте, за исключением одного случая, когда изменения в свойстве объекта отражаются в MemberwiseClone.WPF Binding & MemberwiseClone Problems

Что я делаю - это делать объект MemberwiseClone в моем объекте перед добавлением или редактированием свойств в этом объекте, а затем, если пользователь хочет отменить, я копирую каждое свойство из объекта MemberwiseClone обратно в текущий объект.

Поскольку я использую привязку WPF, использование MemberwiseClone привлекательно для меня, потому что до сих пор любые изменения, внесенные в свойство, не отражались в MemberwiseClone. На этот раз у меня есть свойство в моем объекте, которое является ObservableCollection другого объекта, и что происходит, если я добавлю элемент в ObservableCollection, он также добавится к объекту, созданному элементом MemberwiseClone, и я никогда не смогу действительно отменить.

Есть ли способ обойти это? Любые мысли, которые могут возникнуть по этому поводу, приветствуются.

Спасибо.

ответ

1

В соответствии с Object.MemberwiseClone Remarks ссылки на объекты в вашем ObservableCollection будут скопированы, но не сами ссылки на объект. Поэтому ваша коллекция отменяет ссылки на те же возможные измененные объекты.

Вам нужна глубокая копия, а не мелкая. Посмотрите на How do you do a deep copy an object in .Net (C# specifically)?

+0

Я работаю с методом расширения в ссылке, однако я получаю следующее исключение: введите «System.ComponentModel.PropertyChangedEventManager» в сборке «WindowsBase, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35 'не помечено как сериализуемое. Любые мысли? Я пометил все мои классы как Serializable. – MikeMalter

+0

Вы должны использовать атрибут [Serializable] в своем классе с ObservableCollection. См. [Базовая сериализация] (http://msdn.microsoft.com/en-us/library/4abbf6k0%28v=vs.100%29.aspx) для примера. – LPL

+0

Посмотрите на [этот пост] (http://stackoverflow.com/a/8879533/620360) тоже. – LPL