Xamarin如何将其他项目的类属性绑定到Picker.ItemDisplayBinding
问题根因
你遇到的问题由两个错误共同导致:
- 依赖项目中
magasin类的Name是公共字段,而Xamarin.Forms绑定系统仅支持绑定公共属性,不支持直接绑定字段 ItemDisplayBinding的路径配置错误,不需要携带命名空间、类名前缀,只需写对应属性名即可
修复步骤
第一步:修改otherProject中magasin类的定义
将公共字段改为公共自动属性:
namespace otherProject { public class magasin { // 改为自动属性,添加{ get; set; } public string Code { get; set; } public string Name { get; set; } public magasin(string code) { Code = code; } public static List<magasin> chargerMagasins(){ //Code here} } }
第二步:修改主项目后台的ItemDisplayBinding配置
移除路径的命名空间、类名前缀,直接绑定Name属性即可:
if (listeMagasin != null) { pickerMagasin.ItemsSource = listeMagasin; // 直接绑定属性名即可 pickerMagasin.ItemDisplayBinding = new Binding("Name"); }
可选替代方案(无需修改绑定配置)
如果你可以修改magasin类,也可以直接重写类的ToString()方法,返回要展示的Name属性,这种情况下不需要额外设置ItemDisplayBinding,Picker会自动调用ToString()渲染选项:
namespace otherProject { public class magasin { public string Code { get; set; } public string Name { get; set; } public magasin(string code) { Code = code; } // 重写ToString方法 public override string ToString() { return Name; } public static List<magasin> chargerMagasins(){ //Code here} } }
特殊情况:无法修改otherProject代码的解决方案
如果依赖项目的magasin类不允许修改,你可以在主项目中创建一个包装类,或者在给Picker赋值前将数据源转为匿名类:
if (listeMagasin != null) { // 转为带Name属性的匿名类,绑定逻辑不变 pickerMagasin.ItemsSource = listeMagasin.Select(m => new { m.Name, Source = m }).ToList(); pickerMagasin.ItemDisplayBinding = new Binding("Name"); } // 取值的时候可以从SelectedItem的Source属性拿原始的magasin对象
内容的提问来源于stack exchange,提问作者Maxime V
相关产品推荐
相关产品推荐

