Я столкнулся с интересным случаем для этого только сегодня. Я создаю пользовательский интерфейс, который включает в себя коллекцию FlowDocument
s. Эти элементы представлены в виде ListView
, один из шаблонов ячеек которого RichTextBox
.
Первая проблема, с которой я столкнулся, заключается в том, что свойство Document
RTB не является свойством зависимости, поэтому вы не можете связываться с ним. К счастью, некоторые отважные разработчики столкнулись с этой проблемой раньше, чем я, и реализовали подкласс RichTextBox
с переопределением Document
в качестве свойства зависимости.
Все было хорошо, пока я не реализовал переупорядочение коллекции методом перетаскивания. Здесь я обнаружил одну из причин , почему Document
не DP. Изменение порядка коллекции на самом деле не меняет порядок объектов, к которым они привязаны; перемещенные элементы просто обновляют свои цели привязки. И слава Богу, если FlowDocument
принадлежит одному RichTextBox
, вы не можете назначить его другому. Изменение порядка этих FlowDocuments
нарушает пользовательский интерфейс, что является проблемой, поскольку единственная причина, по которой я делаю этот пользовательский интерфейс, в первую очередь, заключается в переупорядочении этих элементов.
Молоток, которым я решил поразить это, состоял в том, чтобы сделать RichTextBox
свойством моей модели вида. Таким образом, когда я перемещаю FlowDocuments
в коллекции, RTB, владеющие ими, перемещаются вместе с ними.
Лично я не представляю, является ли этот класс тестируемым на модуле. Это не то, что делает это неправильным ответом.
Что делает этот неправильный ответ тем, что теперь, когда я поместил этот компонент в свой класс, он больше не является частью системы маршрутизации событий. Если я изменю FontFamily
в своем стиле FlowDocument
в приложении, эти элементы управления никогда не услышат об этом. Я также не могу ничего связать с ними. (По крайней мере, нелегко.) Возможно, есть другие проблемы, которые я еще не обдумал.
Я не совсем уверен, каким будет правильный ответ в моем случае. Я думаю, что мне, возможно, придется починить мой привязываемый RichTextBox
, чтобы он поддерживал два FlowDocument
объекта: тот, который выставлен миру с помощью Document
геттера и сеттера, и тот, который находится внутри элемента управления сам. (То есть, когда что-то устанавливает свойство Document
для объекта, оно сохраняет это значение в своем закрытом поле, а затем копирует содержимое документа в содержимое свойства base Document
.)
Это очень многословный способ сказать: "Создание объектов WPF в модели представления кажется довольно плохой идеей, когда я это делаю".