Xamarin.Forms如何获取ListView菜单项的BindingContext值及传递多参数
问题1解决方法
空值问题的核心原因是MenuItem.BindingContext绑定的是当前列表行对应的完整数据源对象,而非你单独绑定在Label上的WebUrl字段,你需要先把BindingContext强转为列表绑定用的实体类型,再读取对应属性:
首先你给ListView绑定数据时肯定用到了自定义实体类,示例结构如下:
// 列表绑定用的实体类,你本地的类名可能不同,对应修改即可 public class DocumentItem { public string WebUrl { get; set; } // 其他业务字段 }
修改CheckOutFile事件代码即可正常取值:
protected void CheckOutFile(object sender, EventArgs e) { var menuItem = sender as MenuItem; if (menuItem != null && menuItem.BindingContext is DocumentItem docItem) { // 强转实体类后读取WebUrl属性 DisplayAlert("Alert", $"Check Out File: {docItem.WebUrl} requested", "ok"); } }
问题2解决方法
不需要修改界面展示逻辑,只需要在你的数据源实体类中补充你需要传递的3个关联属性即可,哪怕这些属性不在界面上渲染,也会完整保存在BindingContext中:
先修改实体类补充需要的字段,示例如下:
public class DocumentItem { public string WebUrl { get; set; } // 新增需要传递的关联字段 public int FileId { get; set; } public string FileName { get; set; } public int CreateUserId { get; set; } }
给ListView绑定数据源时,给每个DocumentItem对象的三个新增字段都完成赋值,不需要修改XAML的展示代码,事件中可直接读取所有字段:
protected void CheckOutFile(object sender, EventArgs e) { var menuItem = sender as MenuItem; if (menuItem != null && menuItem.BindingContext is DocumentItem docItem) { // 直接读取所有需要的关联值即可 var webUrl = docItem.WebUrl; var fileId = docItem.FileId; var fileName = docItem.FileName; var userId = docItem.CreateUserId; // 后续写你的业务逻辑即可 } }
内容的提问来源于stack exchange,提问作者dot
相关产品推荐
相关产品推荐

