2009-08-17 6 views
1

私は地形マップを表示するために使用されるキャンバスを持つWPFウィンドウを持っています。 [ProjectFolder]マップにシンボルのコレクションを配置するための適切なMVVMの方法は何ですか?

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

すべてのシンボルは私のプロジェクトのシンボルフォルダに保存されるので、任意のシンボルへのパスは次のようになります。私は次のようにMapSymbolDefinitionが定義されているIEnumerable<MapSymbolDefinition>によると、このマップにシンボルを配置したいと思います/Symbols/SymbolFileName.bmp。

私はこれをどのように設定できるかについて考えていますので、コードビハインドで複数のImageオブジェクトを手動で設定する必要はありませんか?

ありがとうございました。

答えて

2

使用して、カスタマイズされたItemsPanelItemContainerStyleItemTemplateItemsControl:コメント後

<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

+0

私はちょうど1つのことについてはっきりしないと思うので私の質問を編集しました:列挙は実際にはマップシンボルの定義*を含んでいます(シンボル自体ではありません)。したがって、あなたの例では、ItemsSourceは表示したい実際のImageオブジェクトにバインドされていません。 SymbolFileNameから ' devuxer

+0

また、別の言い方をすると、@ sixlettervariablesはこう言っています。 – devuxer

0

WPFの方法:DataTemplatesとListBoxとコンバーターを使用してください.... this exampleをチェックしてください。

簡単な方法:コードビハインドでそれを行い、ビューをコントロールと呼んでください。

関連する問題