You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:Xamarin中UIPickerViewDataSource与UIPickerViewModel的区别及是否仅Xamarin支持

UIPickerViewModel 是否仅存在于 Xamarin?与 UIPickerViewDataSource 的区别

结论:UIPickerViewModel 是 Xamarin.iOS 特有的封装

原生 iOS(Objective-C/Swift)中并没有 UIPickerViewModel 这个类,它是 Xamarin 为适配.NET 开发习惯,对原生 iOS 的 UIPickerViewDataSource 和 UIPickerViewDelegate 进行合并封装后的产物。

两者的核心区别

  • 原生 iOS 架构:
    原生环境下,UIPickerView 的数据逻辑(列数、每行数据数量、内容)由 UIPickerViewDataSource 协议负责,交互与展示逻辑(行高、选中事件、自定义行视图)则由 UIPickerViewDelegate 协议负责,两个协议分离,开发者需要分别实现并绑定给选择器。
  • Xamarin.iOS 的 UIPickerViewModel:
    Xamarin 将原生两个协议的所有方法整合到 UIPickerViewModel 抽象类中,开发者只需继承该类,按需重写所需方法即可,无需分别处理两个协议,代码更集中,符合.NET 开发的类继承模式。

代码示例对比

原生 Swift 实现

class PickerHandler: NSObject, UIPickerViewDataSource, UIPickerViewDelegate {
    // DataSource 方法
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return 5
    }
    
    // Delegate 方法
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return "第 \(row+1) 行"
    }
}

// 绑定使用
let picker = UIPickerView()
let handler = PickerHandler()
picker.dataSource = handler
picker.delegate = handler

Xamarin.iOS 实现

public class PickerViewModel : UIPickerViewModel {
    // 整合 DataSource 和 Delegate 的方法
    public override nint GetComponentCount(UIPickerView pickerView) {
        return 1;
    }
    
    public override nint GetRowsInComponent(UIPickerView pickerView, nint component) {
        return 5;
    }
    
    public override string GetTitle(UIPickerView pickerView, nint row, nint component) {
        return $"第 {row+1} 行";
    }
}

// 绑定使用
var picker = new UIPickerView();
picker.Model = new PickerViewModel();

本质上,UIPickerViewModel 就是 Xamarin 对原生两个协议的包装,功能上与原生同时实现 UIPickerViewDataSource + UIPickerViewDelegate 完全等价,只是代码组织形式更贴合.NET 开发者的习惯。

内容的提问来源于stack exchange,提问作者Pavlos Mavris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:07:21