2009-08-17 1 views
1

지형지도를 표시하는 데 사용되는 Canvas가있는 WPF Window가 있습니다. 다음과 같이 내가 MapSymbolDefinition가 정의된다 IEnumerable<MapSymbolDefinition>에 따라이지도에 심볼을 배치 할 :맵에 심볼 컬렉션을 배치하는 올바른 MVVM 방법은 무엇입니까?

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

모든 기호는 내 프로젝트의 기호 폴더에 저장되므로 어떤 기호의 경로가 될 것이다 [ProjectFolder] /Symbols/SymbolFileName.bmp.

코드 숨김에서 이미지 개체를 수동으로 채울 필요가 없도록 설정하는 방법에 대한 의견이 있으십니까?

감사합니다.

답변

2

사용을 사용자 정의 ItemsPanel, ItemContainerStyleItemTemplateItemsControl : 의견 후

<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, 플러스 이미지를 수행하는 DataTemplate. – user7116

+0

안녕하세요, 켄트. 나는 열거가 실제로 기호 기호 (기호 그 자체가 아닌)의 * 정의 *를 포함한다고 생각하기 때문에 내 질문을 편집했습니다. 따라서 귀하의 예에서, ItemsSource는 보여주고 자하는 실제 Image 객체에 바인딩되지 않습니다. SymbolFileName을 devuxer

+0

다른 식으로 말하자면, @sixlettervariables는 다음과 같이 말했습니다. – devuxer

0

WPF 방식 : DataTemplates와 ListBox 및 변환기를 사용하고 .... this example을 확인하십시오.

빠른 방법 : 코드 숨김에서 컨트롤을 호출하면됩니다.

관련 문제