I prefer to use view model first approach. For many reasons:
- Vms are your application containing most of logic apart from glue code in form of behaviors or triggers.
- If you creates views then you are responsible for its life and cleanup code. You have to deal with threading and other issues which are difficult to test. On the other hand of you create vms and leave the view creation logic with WPF via data template.. you don't have to worry about threading issue. And there will be better separation of concerns.
- With vm first approach zero code behind.
- With a project level isolation for view and vms you can restrict developers using view specific things like dispatcher in the view model leaving more cleaner and testable code base. I.e view project sprojec to vm. And vm project should not refer to any presentation lib.
- If there is clear boundary between view and vm. Both can evolve and will be less fragile.