アプリケーション設定を行うウインドウを持つサンプルプログラムを作成してみました。MainWindow、モードレスウィンドウの Modeless01Window そしてメニューアイテムの ツール > オプション から表示する OptionWindow の3つのウィンドウを持ちます。
ウィンドウ遷移のコントロールなどにMakCraftViewModelBaseパッケージを利用しています(パッケージは NuGet から入手できます)。
プログラムソースは、GitHub に .NET Framework 版、.NET Core 版があるので、詳しくはそちらをご覧ください。なお、あくまでサンプルなので次回起動時のための状態の保存と復元機能は実装していません。
ウィンドウは次のようになっています。



OptionWindow で「Font Size」、「Title font size magnification」の値を変更すると、MainWindow、Modeless01Window の文字の大きさ、タイトルの文字の大きさが変わります。
内部的には、シングルトンクラス OptionSources がイベントソースとして上記二つのプロパティの変更時に PropertyChanged イベントを発生させています。イベントリスナーは MainWindowViewModel と Modeless01WindowViewModel になりますが、普通にイベントの割り当てを行うと、OptionSources のインスタンスはアプリケーション終了時まで生存しているために Modeless01Window のインスタンスへの参照が残っているため、明示的にイベントの割り当ての削除を行わないとガベージコレクションの対象にならずにメモリを占有し続けてしまいます。そこで、そうならないように IWeakEventListener インターフェイスを実装した WeakEventViewModelBase クラスの機能を派生クラスのビューモデルから利用しています。