2012-04-12 5 views
1

여기 약간 우스꽝 스럽습니다. 채우려는 ViewModel에 List<BitmapImage>이 있습니다. ItemsControl과 함께 뷰에 목록을 표시하려고하는데 이미지가 표시되지 않습니다. 이상하게도 이미지 태그를 사용하고있는 경우 동일한 컬렉션에 액세스하여 표시 할 이미지를 얻을 수 있습니다.이미지 바인딩이 ItemsControl에없는 이미지에서 작동합니다.

<ItemsControl ItemsSource="{Binding Path=Images}" MinHeight="80"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Image Source="{Binding}" MinWidth="80" MinHeight="80" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
    <Image HorizontalAlignment="Left" Name="image1" Stretch="Uniform" VerticalAlignment="Top" Source="{Binding Path=Images[0]}" MinHeight="80" MaxHeight="200" /> 

이 둘은 모두 Images입니다. 이미지가 나타나고 ItemsControl은 비어있게됩니다. 무슨 일 이니?

+0

코드가 나에게 맞는 것처럼 보이지만 어떻게'Images' 속성을 설정하고 있습니까? 그것을 수정하고 있습니까? –

+0

웹에서 이미지로 채워집니다. 나는'Image' 태그가 첫 번째 이미지를 표시하고 있기 때문에 작동하는 것을 확신합니다. – Tyrsius

+0

바인딩이 발생하기 전이나 후에 목록이 채워 집니까? ObservableCollection을 사용하지 않으므로 먼저 바인딩 한 다음 채우면 ItemsControl에서 항목을 보지 않습니다. –

답변

0

목록과 대조되는 ObservableCollection을 사용하여이 문제를 해결할 것입니다. ItemsControl은 List 변경 알림에서 리 바인드하지 않습니다. ObservableCollection을 사용하는 경우 명시 적으로 List에 대한 변경 알림을 호출하는 것에 대해 걱정할 필요가 없습니다.

시나리오를 복제하고 ObservableCollection을 사용하여 문제를 해결할 수있었습니다. 이유에 : 특히 http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

, 설명 부분에서이 인용 참조하십시오 바운드 클라이언트와 데이터 소스 사이의 바인딩에서 발생하는 변경 통지를 들어

를, 당신의 바운드 형 중 하나를해야 다음 구현 INotifyPropertyChanged 인터페이스 (기본 설정). 바인딩 된 유형의 각 속성에 대한 변경 이벤트를 제공하십시오. 둘 다하지 마십시오.

+0

당신은 맞지만 INotifyPropertyChanged가 호출 된 후리스트가 업데이트되지 않는 이유에 대해 궁금합니다. – Tyrsius

+0

@Tyrsius : * 새 목록이 있고 INotifyPropertyChanged를 사용하면 업데이트됩니다. 기존 목록을 수정하는 경우 (지우고 다시 채우는 것을 포함하여) 속성은 여전히 ​​같은 목록을 가리키기 때문에 그렇지 않습니다. –

+0

@MattBurland 아, 그건 의미가 있습니다. INotifyPropertyChanged를 사용하여 컬렉션을 업데이트 할 수있는 방법이 없습니까? – Tyrsius

관련 문제