将datatemplate图像绑定到WPF中的自定义对象的属性

时间:2012-01-12 15:59:58

标签: wpf

我有一个收藏品 private ObservableCollection<ImageData> imageDataList = new ObservableCollection<ImageData>();其中ImageData是自定义对象。它有一个名为fileName的属性,一个存储图像文件完整路径的字符串。在我的XAML代码中,我有一个带有datatemplate的列表框,如下所示。

<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图像源吗?

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

将DataContext设置为ObservableCollection所在对象的位置

DateContext = this;

而不是fileName将其绑定到ImageSource属性或BitmapImage属性,这是使用fileName创建的。

答案 2 :(得分:0)

回答您的问题:您无法将ImageSource属性绑定到字符串。它适用于XAML,因为当您在XAML中设置值时,WPF使用从字符串到ImageSource的默认转换器。如果要使用绑定或代码设置值,则需要提供ImageSource对象。

通过绑定有两种方法:

第一个呈现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();
    }
}

第二个选项是在ImageData类中创建ImageSource并直接绑定到它。

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