2013-05-06 2 views
1

ItemsTemplate을 통해 사용자 지정 "Document"개체 컬렉션에 목록 상자를 바인딩하려고하지만 이미지를 Document.ImageResourcePath 속성에 바인딩하는 동안 문제가 발생합니다. 여기 내 마크 업입니다<Image> 바인딩에서 작업하지 않는 소스

<ListBox Name="lbDocuments"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <Image Source="{Binding Path=ImageResourcePath}" 
            Margin="5,0,5,0"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate>     
</ListBox> 

이것은 목록 상자가있는 양식의로드 이벤트입니다.

private void Window_Loaded_1(object sender, RoutedEventArgs e) 
    { 

     List<Objects.Document> docs = Objects.Document.FetchDocuments(); 
     lbDocuments.ItemsSource = docs; 
    } 

내 문서 클래스는 문서 확장명에 따라 리소스 폴더에있는 리소스 이미지에 문자열을 보유합니다.

완벽하게 유형을 문서로 (23)에 결합 될 때 윈도우가로드 내 목록 상자에서 절대적으로 아무것도 얻을 수없는 경우

case Cache.DocumentType.Pdf: 
    this.ImageResourcePath = "/JuvenileOrganizationEmail;component/Resources/pdf_icon.jpg"; 
    break; 

(이 문서 클래스 내에서 case 문의 일부입니다). 나는 무엇을 잘못 할 수 있 었는가?

+1

당신은 당신의 창'DataContext'을 설정하여 Window.cpp 파일에서

<ListBox Name="lbDocuments" ItemsSource={Binding Docs}> <ListBox.ItemTemplate> <DataTemplate> <StackPanel> <Image Source="{Binding Path=ImageResourcePath}" Margin="5,0,5,0"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> 

은 (당신이 MVVM을하고 있다면하지만, 별도의 뷰 모델 클래스를 추천 할 수있다)? –

+1

디버깅을 위해 이미지의 크기가 고정되어있는 경우 (즉, 크기가 0 인 경우) 고정 폭과 높이를 설정하고 동일한 필드에 바인딩 된 StackPanel에 TextBlock 또는 유사한 것을 추가하여 볼 수 있습니다. 올바른 데이터가 바인드되어 있는지 여부. 또한 Output 창에서 바인딩 오류를 확인하십시오. –

+0

@DavidCummins 방금 텍스트 블록을 추가했는데 팝업이 표시되지만 하드 코딩 된 20x20으로도 여전히 이미지가 표시되지 않습니다. – Adrian

답변

1

List 대신 ObservableCollection을 사용하고 Window에 "클래스 수준"이라는 참조를 사용하십시오.

ObservableCollection<Objects.Document> _docs; 

Window 's Ctor에 DataContext가 설정되어 있는지 확인하십시오.

private void Window_Loaded_1(object sender, RoutedEventArgs e) 
    { 
     lbDocuments.ItemsSource = _docs; 
    } 

또는 대체 솔루션이 컬렉션의 공용 속성에 직접 목록 상자의 ItemsSource 바인딩됩니다

public Window() 
{ 
    _docs = new ObservableCollection<Objects.Document>(Objects.Document.FetchDocuments()); 
    this.DataContext = this; 
} 

그렇다면, 당신은 당신의 창로드 이벤트를 업데이트 할 수 있습니다. 이것은 Ctor (위)가 여전히 사용된다고 가정합니다.

public ObservableCollection<Objects.Document> Docs 
    { 
    get { return _docs; } 
    } 
+0

문제가 해결되었습니다. 내 문제는 ** this.DataContext = this **와는 달리 내가 사용했던 것입니다. this.lbDocuments.DataContext = docs – Adrian

+0

@ 애드리안 위대한! 다행 했어. –

관련 문제