Xamarin.Forms:如何在ListView中绑定PCL项目的嵌入式资源图片
解决Xamarin.Forms中ListView绑定PCL嵌入式资源图片的问题
我之前也碰到过一模一样的坑!直接在绑定表达式里写ImageSource.FromResource(ImageUrl)肯定行不通,因为绑定系统没法直接解析这种方法调用。这里给你两种实用的解决方案:
方法一:使用值转换器(ValueConverter)
这是最通用的做法,能把数据源里的资源路径字符串转换成ImageSource。
- 创建资源转换器类
public class EmbeddedImageConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is string resourcePath && !string.IsNullOrEmpty(resourcePath)) { // 替换成你的PCL项目对应的程序集(这里用转换器所在的程序集就行) var assembly = typeof(EmbeddedImageConverter).Assembly; return ImageSource.FromResource(resourcePath, assembly); } return null; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
- 在DataTemplate中使用转换器
如果是用代码创建模板,直接实例化转换器并绑定即可:
var imageConverter = new EmbeddedImageConverter(); listView.ItemTemplate = new DataTemplate(() => { Image img = new Image(); // 这里的ImageUrl是数据源里存储的嵌入式资源完整路径 img.SetBinding(Image.SourceProperty, new Binding("ImageUrl", converter: imageConverter)); // 其他控件的绑定逻辑... return new ViewCell { View = img }; });
方法二:在ViewModel中直接返回ImageSource
如果你的列表项数据源是ViewModel对象,也可以直接把属性改成返回ImageSource类型:
public class ListItemViewModel { private string _resourcePath; public ImageSource ItemImage { get { // 替换成你的PCL项目程序集 var assembly = typeof(ListItemViewModel).Assembly; return ImageSource.FromResource(_resourcePath, assembly); } } // 用来传入资源路径的属性 public string ResourcePath { set => _resourcePath = value; } }
绑定的时候直接指向这个ItemImage属性就好:
img.SetBinding(Image.SourceProperty, "ItemImage");
必须注意的关键点
- 嵌入式资源的完整路径:你的
ImageUrl(或ResourcePath)必须是资源的完整命名空间路径,比如PCL项目叫MyApp.Core,图片放在Assets/Images文件夹里,名字是dog.png,那路径就是MyApp.Core.Assets.Images.dog.png,大小写要完全匹配! - 程序集要选对:调用
ImageSource.FromResource时,一定要传入PCL项目的程序集,别用平台项目的。 - 确认生成操作:务必检查图片的生成操作已经设置为
Embedded Resource(右键图片→属性里可以修改)。
内容的提问来源于stack exchange,提问作者Manoj
相关产品推荐
相关产品推荐

