2012-01-12 16 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イメージソースへのオブジェクトの文字列メンバーに正しくデータバインドする方法を教えてください。 DataContextのを設定し

+0

あなたに_anything_が表示されますか?あなたがListBox.ItemTemplateのコードをコメントアウトするとどうなるでしょうか([ImagaData.ToString()])) –

答えて

0

のObservableCollectionを

DateContext = this; 

に位置しているオブジェクトはまた、代わりに、ファイル名のImageSourceは施設またはBitmapImageのプロパティにバインドし、これを使用して作成されている場所へファイル名。

+0

Juan Carlos Vega Neiraのようなコンバータを使うことができます – MyKuLLSKI

0

質問に答えてください:ImageSourceプロパティを文字列にバインドすることはできません。 XAMLで値を設定すると、WPFは文字列からImageSourceへの既定のコンバータを使用するため、XAMLで動作します。バインディングまたはコードから値を設定する場合は、ImageSourceオブジェクトを指定する必要があります。

が結合することにより、それを行うには2通りの方法があります。

最初のものは、(リンクフアン・カルロスが言及した)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(); 
    } 
} 

2番目のオプションは、あなたのImageDataクラスであなたのImageSourceはを作成し、それに直接結合することです。

private ImageSource _imageSource 
public ImageSource ImageSource 
{ 
    get 
    { 
    if (_imageSource == null) 
    { 
     _imageSource = new BitmapImage(new Uri(fileName), UriKind.RelativeOrAbsolute); 
    } 
    return _imageSource; 
    } 
} 
関連する問題