Wpf 在地图上放置符号集合的正确MVVM方法是什么?

Wpf 在地图上放置符号集合的正确MVVM方法是什么?,wpf,mvvm,Wpf,Mvvm,我有一个带有画布的WPF窗口,用于显示地形图。我想根据IEnumerable在该地图上放置符号,其中MapSymbolDefinition定义如下: public class MapSymbolDefinition { string SymbolFileName { get; set; } int XLocation { get; set; } int YLocation { get; set; } } 所有符号都存储在我的项目的symbols文件夹中,因此任何符号的路径都是[Pr

我有一个带有画布的WPF窗口,用于显示地形图。我想根据
IEnumerable
在该地图上放置符号,其中
MapSymbolDefinition
定义如下:

public class MapSymbolDefinition
{
  string SymbolFileName { get; set; }
  int XLocation { get; set; }
  int YLocation { get; set; }
}
所有符号都存储在我的项目的symbols文件夹中,因此任何符号的路径都是[ProjectFolder]/symbols/SymbolFileName.bmp

有没有想过如何设置它,这样我就不必在代码隐藏中手动填充一堆图像对象


谢谢。

WPF方式:使用数据模板、列表框、转换器和。。。。退房


快速方法:只需在代码隐藏中执行此操作,并将您的视图称为控件。

使用带有自定义
ItemsPanel
itemscontainerstyle
itemstemplate
ItemsControl

<ItemsControl ItemsSource="{Binding MapSymbols}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="Canvas.Top" Value="{Binding YLocation}"/>
            <Setter Property="Canvas.Left" Value="{Binding XLocation}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type local:MapSymbolDefinition}">
            <Image Source="{Binding SymbolFileName, Converter={StaticResource ImageNameConverter}}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>


评论后更新:您可以定义一个
项目模板
,为集合中的每个项目提供可视化树。在本例中,我使用转换器将
SymbolFileName
属性转换为图像,但您也可以在
MapSymbolDefinition
类上定义一个单独的属性,以生成完整路径。后一种方法更符合MVVM最佳实践。

嗨,肯特。我刚刚编辑了我的问题,因为我认为有一点不清楚:枚举实际上包含地图符号的定义(而不是符号本身)。因此,在您的示例中,ItemsSource没有绑定到我要显示的实际图像对象。有没有什么方法可以包含一个从SymbolFileName转换为
的数据模板,或者换句话说,@sixlettvariables所说的:)@DanThMan:实际上代码看起来很完美(不说绑定)<您只需要
数据模板中的code>
。Kent处理的令人困惑的部分是让
ItemContainerStyle
执行
Canvas
偏移。