更新: 考えれば考えるほど、優れたデータ バインディング サポート (MVVM にとって重要) を備えたカスタム コントロールに傾倒しています。これをカバーするネット上の情報源はたくさんあります。
質問に対する半分の答えは、2 つの問題があるということです。1 つ目は、複雑なデータの表示とバインド サポートの公開です。2 つ目は、それにバインドする MVVM の実践です (ただし、問題の大部分は図に示されているため、これは簡単です)。MVVM はどのようにベクトル グラフィックスを実行しますか? そうではなく、コントロールが行います。コントロールは、拡張可能/汎用的な方法で必要なものをどのように公開しますか? 確かではありませんが、CodePlex の WPF Control Toolkit ライブラリには、さらに複雑な例がいくつか含まれています。
これは実際には「どうぞ」という答えではありませんが、考え方の観点からは、ViewModel がどのように「表示」されるかを気にするべきではないということを考慮する必要があると思います (ViewModel は View を認識していないため)。
ただし、ViewModel がどのモデルが表示されるかを気にするべきではないと言っているわけではありません。
オフィス プランを表現するための適切なモデル構造 (高さ、x/y 座標などのプロパティを含む) は重要な部分です。その後、ViewModel はモデルを検証できます。ビューはそのような検証結果に応答するだけです。これは明らかに、ViewModel とモデルの間の結合を作成します。「ルール」が何であるかはわかりません。
これの視覚的表現はモデルからぶら下がり、「ドアを挿入」などのコマンドは、標準の MVVM ルーティング コマンド スタイルのコーディングで解決できます。あなたの場合、ViewModel の応答は、関連付けられた CurrentSelectedWall でオフィス プラン モデルに新しいドアを挿入することです。
またはそのようなもの。
私が答えられない質問は、ビューとモデルの間の認識された密結合は許可されているかということです。私のサンプルでは、モデルは、ビューが形状 (高さ、x/y など) を描画するためのすべての重要な情報を保持します。おそらくこれは抽象化できます。
残念ながら、XAML での単純なデータ バインディングではビューを作成できない可能性があります。これを行うには、ビュー コードを多用する方法しかありません... :-(
別の方法は、必要なデータを公開し、そのデータを受け取るためのデータ バインディング ポイントを提供するカスタム コントロールです。