2009-08-17 27 views
1

我有一个用于显示地形图的画布的WPF窗口。我想根据IEnumerable<MapSymbolDefinition>其中MapSymbolDefinition被定义为把这个地图上的符号如下:在地图上放置符号集合的正确MVVM方式是什么?

public class MapSymbolDefinition 
{ 
    string SymbolFileName { get; set; } 
    int XLocation { get; set; } 
    int YLocation { get; set; } 
} 

所有符号存储在我的项目的符号文件夹中,这样的路径,任何符号将是[ProjectFolder] /Symbols/SymbolFileName.bmp。

有关如何设置这个的任何想法,所以我不必在代码隐藏中手动填充一堆Image对象?

谢谢。

回答

2

使用ItemsControl与定制ItemsPanelItemContainerStyleItemTemplate:评论后

<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> 

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

+0

+1,加上做Image的DataTemplate。 – user7116 2009-08-17 17:14:45

+0

嗨,肯特。我刚刚编辑了我的问题,因为我认为一件事情还不清楚:枚举实际上包含地图符号的*定义*(而不是符号本身)。所以,在你的例子中,ItemsSource没有绑定到我想要显示的实际Image对象。有没有一种方法可以包含从SymbolFileName转换为' devuxer 2009-08-17 17:18:09

+0

或者换一种说法,@sixlettervariables说:) – devuxer 2009-08-17 17:21:51

0

WPF方式:使用DataTemplates和ListBox以及转换器和....检出this example

快速的方法:只需在代码隐藏方面做到这一点,并将您的视图称为控件。

相关问题