我会推荐一个非常不同的方法,我相信会有相同的目标结束,但会从您的视图模型中删除任何控制特定的逻辑。
首先,我们需要一个逻辑视图模型来表示画布上的对象。假设它是国家,画布是地图。也许虚拟主机看起来像这样:
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正常。