【问题标题】:Bind datatemplate image to an attribute of custom object in WPF将数据模板图像绑定到 WPF 中自定义对象的属性
【发布时间】:2012-01-12 15:59:58
【问题描述】:

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

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

【问题讨论】:

  • 你看到任何东西了吗?如果您注释掉 ListBox.ItemTemplate 代码,您会看到什么(您应该看到 [ImagaData.ToString()])?

标签: wpf


【解决方案1】:
【解决方案2】:

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

DateContext = this;

也代替 fileName 将它绑定到 ImageSource 属性或 BitmapImage 属性,这是使用 fileName 创建的。

【讨论】:

  • 我想你可以使用 Juan Carlos Vega Neira 建议的转换器
【解决方案3】:

回答您的问题:您不能将 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;
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多