Я не думаю, что вы можете избежать использования рефлексии для вызова InitializeComponent (чтобы ответить на ваш вопрос об альтернативных способах). Избегание выделенного кода имеет свои преимущества и недостатки, одно из преимуществ, которое я вижу, заключается в том, что двойной щелчок на любом элементе управления больше не работает ни в Blend, ни в Visual Studio. Это «заставляет» меня никогда не делать «быстрых решений» для определенных действий.
С другой стороны, выполнение «быстрых исправлений» для проверки чего-либо становится более сложным, так что это выбор, который вы должны принять.
Нет ничего плохого в том, что код-сзади лежит в одном, в одном из моих текущих больших проектов у меня нет кода-в-конце в течение ок. 20% файлов XALM, в остальном я просто не удалил их (пока).
Вы можете реализовать перетаскивание, не полагаясь на логику кода позади , я сделал это с моим проектом Silverlight 4, который требовал обработки некоторых действий при запуске вне браузера без границы окна.
В зависимости от вашей MVVM-реализации и инфраструктуры вы можете получить доступ к представлению из вашей модели представления. Хотя по возможности этого следует избегать, иногда это просто нереальное решение. Например, Caliburn.Micro предоставляет чистый способ доступа к представлению, реализуя интерфейс IViewAware и вызывая метод GetView.