我有一个收藏品
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图像源吗?
答案 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;
}
}