非常に異なるアプローチをお勧めします。これは、希望する目的と同じになると思いますが、ビューモデルからコントロール固有のロジックを削除します。
まず、キャンバス上のオブジェクトを表す論理ビューモデルが必要です。それが国であり、キャンバスが地図であるとしましょう。おそらく、VMは次のようになります。
public class Country : PropertyChangedBase {
public string Name {get;set;}
public double X {get;set;}
public double Y {get;set;}
}
簡単にするためにINPCビットを省略しました。次に、マスタービューモデル(質問のプレゼンター)は次のようになります。
public class Map : PropertyChangedBase {
public ObservableCollection<Country> Countries {get;set;}
}
国ごとにキャンバスに赤い点を配置します。その場合、対応するXAMLは次のようになります(ルート要素を省略)。
<ItemsControl ItemsSource="{Binding Countries}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Ellipse Fill="Red"
Width="16"
Height="16"
Canvas.Top="{Binding Y}"
Canvas.Left="{Binding X}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
イベントを処理する必要がある場合は、通常どおりXAMLに接続します。