2012-01-12 4 views
0

컬렉션이 있습니다 private ObservableCollection<ImageData> imageDataList = new ObservableCollection<ImageData>(); 여기서 ImageData는 사용자 지정 개체입니다. 이미지 파일의 전체 경로를 저장하는 문자열 fileName이라는 속성이 있습니다. 내 XAML 코드에서는 다음과 같이 datatemplate이있는 목록 상자가 있습니다.WPF에서 사용자 지정 개체의 특성에 이미지 데이터 바인딩

<ListBox Name="listBox_ImageList" Grid.ColumnSpan="3" Grid.Row="2" SelectionChanged="listBox_ImageList_SelectionChanged"> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 

     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Image Source="{Binding fileName}" Height="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox, AncestorLevel=1}, Path=ActualHeight}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

imageDataListImagaData 개체를 채우는 후, 나는 그것을 실행할 때, 내가 어떤 이미지를 볼 수 없습니다, 그러나

this.listBox_ImageList.ItemsSource = imageDataList;을 설정합니다. WPF 이미지 소스 객체의 문자열 멤버에 제대로 데이터 바인딩하는 방법을 알려주십시오.

+0

_anything_가 표시됩니까? ListBox.ItemTemplate 코드를 주석 처리하면 ([ImagaData.ToString()] 참조) 무엇을 볼 수 있습니까? –

답변

0

설정의 DataContext 여기서 ObservableCollection에가 ImageSource 속성 또는 BitmapImage 속성에 바인딩 대신 파일명 또한

DateContext = this; 

위치되고 이것은 이용하여 생성 된 객체 파일 이름.

+0

Juan Carlos Vega Neira와 같은 변환기를 사용하는 것이 좋습니다. – MyKuLLSKI

0

질문에 대답 : ImageSource 속성을 문자열에 바인딩 할 수 없습니다. WPF는 XAML에서 값을 설정할 때 문자열에서 ImageSource 로의 기본 변환기를 사용하므로 XAML에서 작동합니다. 바인딩 또는 코드에서 값을 설정하려면 ImageSource 객체를 제공해야합니다.

바인딩을 통해 작업을 수행하는 두 가지 방법이 있습니다 :

첫 번째는 (링크 후안 카를로스 언급) here 제시하고, 그것은 당신의 문자열을하고 ImageSource로 변환하는 IValueConverter를 만드는 작업이 포함됩니다. 나는이 거기 제시 변환 코드를 수정합니다 :

public sealed class StringToImageSourceConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     try 
     { 
      return new BitmapImage(new Uri((string)value)); 
     } 
     catch 
     { 
      return DependencyProperty.UnsetValue; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

두 번째 옵션은 imageData의 클래스에 ImageSource를 만들고 직접 결합하는 것입니다.

private ImageSource _imageSource 
public ImageSource ImageSource 
{ 
    get 
    { 
    if (_imageSource == null) 
    { 
     _imageSource = new BitmapImage(new Uri(fileName), UriKind.RelativeOrAbsolute); 
    } 
    return _imageSource; 
    } 
} 
관련 문제