Как я могу отредактировать неизменные объекты в WPF, не копируя код?

Я помещу его этот путь. Мне не нравится программировать к API Win32. Это может быть боль по сравнению с управляемым кодом. НО, я рад, что знаю это, потому что я могу записать программы, что иначе я не был бы в состоянии. Я могу записать программы, что другие люди не могут. Плюс он дает Вам больше понимания, что Ваш управляемый код делает негласно.

12
задан Jacob Stanley 14 May 2009 в 08:33
поделиться

2 ответа

Для решения этой проблемы можно использовать дескрипторы настраиваемого типа. Перед привязкой к Position ваш дескриптор типа может сработать и предоставить методы get и set для временного построения значений. Когда изменения будут зафиксированы, он может построить неизменяемый объект.

Это может выглядеть примерно так:

DataContext = new Mutable(position, 
    dictionary => new Position(dictionary["lattitude"], ...)
);

Ваши привязки все еще могут выглядеть так:

<TextBox Text="{Binding Path=Lattitude}" />

Потому что Mutable объект будет «притворяться» имеющим свойства, подобные Lattitude, благодаря своему TypeDescriptor.

В качестве альтернативы вы можете использовать конвертер в своих привязках и придумать какое-то соглашение.

Ваш Mutable класс примет текущий неизменяемый объект и Func , который позволит вам создать новый неизменяемый объект после завершения редактирования. Ваш Mutable класс будет использовать дескриптор типа, которые будут создавать PropertyDescriptors, которые создают новый неизменяемый объект после установки.

Пример использования дескрипторов типов см. Здесь:

http://www.paulstovell.com/editable-object-adapter

Отредактируйте : если вы хотите ограничить частоту использования создаются неизменяемые объекты, вы также можете посмотреть BindingGroups и IEditableObject, которые также может реализовать ваш Mutable.

5
ответ дан 2 December 2019 в 23:08
поделиться

Можете ли вы придумать элегантный способ решения этой проблемы?

Честно говоря, вы просто танцуете вокруг проблемы, но не упоминаете о самой проблеме;).

Если я правильно угадайте свою проблему, тогда комбинация MultiBinding и IMultiValueConverter должна помочь.

HTH.

PS Кстати, у вас есть неизменяемые экземпляры классов, а не объекты значений. С объектами значений (которые описываются ключевым словом struct ) вы будете танцевать гораздо больше, независимо от того, есть ли сеттеры или нет :).

0
ответ дан 2 December 2019 в 23:08
поделиться
Другие вопросы по тегам:

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