Я помещу его этот путь. Мне не нравится программировать к API Win32. Это может быть боль по сравнению с управляемым кодом. НО, я рад, что знаю это, потому что я могу записать программы, что иначе я не был бы в состоянии. Я могу записать программы, что другие люди не могут. Плюс он дает Вам больше понимания, что Ваш управляемый код делает негласно.
Для решения этой проблемы можно использовать дескрипторы настраиваемого типа. Перед привязкой к 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.
Можете ли вы придумать элегантный способ решения этой проблемы?
Честно говоря, вы просто танцуете вокруг проблемы, но не упоминаете о самой проблеме;).
Если я правильно угадайте свою проблему, тогда комбинация MultiBinding и IMultiValueConverter должна помочь.
HTH.
PS Кстати, у вас есть неизменяемые экземпляры классов, а не объекты значений. С объектами значений (которые описываются ключевым словом struct
) вы будете танцевать гораздо больше, независимо от того, есть ли сеттеры или нет :).