Очень просто на самом деле. Я реализовал много форм с таким механизмом обмена.
Вы можете сделать это с помощью конвертера и выполнить простое преобразование BooleanToVisibility для свойства IsEditable, которое существует для сущностей, которые вы привязываете к своему TreeView. Внутри TreeView ItemTemplate просто свяжите TextBlock таким образом, чтобы он свернулся, когда свойство IsEditable имеет значение true, и свяжите TextBox таким образом, чтобы он свернулся, когда свойство IsEditable имеет значение false (и наоборот).
Если вы хотите создать собственный элемент управления ClickToEdit, вам нужно будет сделать следующее:
- Создайте класс, который наследуется от ContentControl
- Предоставьте новые свойства зависимостей типа DataTemplate: одно называется EditableTemplate.
- Добавьте обработчик события MouseLeftButtonUp внутри OnApplyTemplate для прослушивания щелчка.
- Измените активный шаблон содержимого на EditableTemplate для события click.
- Изменить шаблон обратно, когда элемент управления теряет фокус.
Теперь, чтобы использовать свой собственный элемент управления внутри TreeView:
- Переопределите ваш ItemTemplate для TreeView
- Поместите туда свой элемент управления ClickToEdit
Реализация пользовательского элемента управления позволит вам (или другим разработчикам) легко указать, какой элемент управления они хотели бы использовать в качестве редактора содержимого. Например, они могли бы указать NumericUpDown или DateTimePicker вместо того, чтобы просто использовать TextBox.
Проверьте DataForm в Silverlight 3. Он имеет схожую функциональность, но переключение между редактируемым и доступным только для чтения щелчком мыши не выполняется.