2012-01-12 2 views
0

У меня есть коллекция private ObservableCollection<ImageData> imageDataList = new ObservableCollection<ImageData>(); где ImageData - это настраиваемый объект. Он имеет атрибут, называемый fileName, который содержит полный путь к файлу изображения. В моем коде XAML у меня есть список с datatemplate следующим образом.Связать образ 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> 

После заполнения ImagaData объектов в imageDataList, я поставил this.listBox_ImageList.ItemsSource = imageDataList;

Однако, когда я бегу, я не вижу каких-либо изображений. Не могли бы вы рассказать мне, как правильно привязать данные к члену строки объекта к источнику изображения WPF?

+0

Вы видите _anything_? что вы видите, если вы закомментируете код ListBox.ItemTemplate (вы должны увидеть [ImagaData.ToString()])? –

ответ

0

Установите DataContext, где объект, где ObservableCollection находится

DateContext = this; 

Кроме того, вместо FileName привязать его к ImageSource собственности или BitmapImage собственности, и это создается с помощью имя файла.

+0

Я полагаю, вы можете использовать конвертер, например, Хуан Карлос Вега Нейра – MyKuLLSKI

0

Чтобы ответить на ваш вопрос: вы не можете привязать свойство ImageSource к строке. Он работает в XAML, потому что WPF использует преобразователь по умолчанию из строки в ImageSource, когда вы устанавливаете значение в XAML. Если вы хотите установить значение с помощью привязки или из кода, вам необходимо предоставить объект ImageSource.

Есть 2 способа сделать это с помощью связывания:

Первый из представленных here (ссылка Juan Carlos упоминается), и включает в себя создание IValueConverter, который отвезет вашу строку и преобразовать его в ImageSource. Я хотел бы изменить конвертер код, представленный там с этим:

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(); 
    } 
} 

Второй вариант заключается в создании вашего ImageSource в классе ImageData и привязать к нему напрямую.

private ImageSource _imageSource 
public ImageSource ImageSource 
{ 
    get 
    { 
    if (_imageSource == null) 
    { 
     _imageSource = new BitmapImage(new Uri(fileName), UriKind.RelativeOrAbsolute); 
    } 
    return _imageSource; 
    } 
} 
Смежные вопросы