The architecture of a program depends on different varibles and there is no one correct answer which I can give you. However, I can propose some ways to handle your issue:
Keep a Master ViewModel (which is what you are doing now). Create a ViewModel for each View and use a common class (e.g Service) to share patient info between the View models. In this case, service may also expose an event which can be raised when patient info is changed.
Use a light weight WPF infrastructure like
MVVM Light Toolkit
to share changes in patient info by using the Messenger instance. (Like option 2, but using free 3rd party infrastructure)Use
PRISM
with DI.
If all of yours View-ViewModel code resides in the same DLL, you might consider using option 2, or 3.
If some of the View-ViewModel resides in different assemblies you might consider using option 4 which presents the EventAggregator
design pattern.
Hope this help to get you on the right path.