2009-08-17 60 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

快速的方法:只需在代碼隱藏方面做到這一點,並將您的視圖稱爲控件。

相關問題