Xamarin.Forms MVVM模式下Picker控件SelectedItem无法从数据库赋值求解
问题根因
- 赋值方式错误,未触发属性变更通知
你直接修改SelectedMaritalStatus.Value的属性值,不会触发SelectedMaritalStatus属性的SetProperty方法,也就不会发送属性变更通知到前端Picker控件,控件感知不到值的变化。 - Picker的SelectedItem匹配规则限制
Xamarin.Forms Picker的SelectedItem是按引用匹配的,只有你赋值的对象和ItemsSource列表里的某个对象是同一个引用时,才会被识别为选中项。你修改属性后的对象并不在绑定的MaritalStatusList列表中,Picker无法匹配到对应选项。 - 你当前
GetMaritalStatus方法里所有选项的Key都是1,属于数据配置错误,如果后续按Key匹配会找不到对应项。
修复步骤
1. 修正数据源的Key配置
先将每个婚姻状态对应唯一Key:
public static class MaritalStatus { public static List<KeyValuePair> GetMaritalStatus() { return new List<KeyValuePair>() { new KeyValuePair() {Key=1, Value="Single"}, new KeyValuePair() {Key=2, Value="Married"}, new KeyValuePair() {Key=3, Value="Widowed"}, new KeyValuePair() {Key=4, Value="Divorced"}, new KeyValuePair() {Key=5, Value="Civil Partnership"} }; } }
2. 更换正确的赋值方式
不要直接修改SelectedMaritalStatus的属性,而是从已经初始化的MaritalStatusList里找到匹配项,再把整个对象赋值给SelectedMaritalStatus:
// 替换你原来的 SelectedMaritalStatus.Value = details.MaritalStatus; 这行代码 // 如果数据库存的是婚姻状态的文本值,就按Value匹配 SelectedMaritalStatus = MaritalStatusList.FirstOrDefault(m => m.Value == details.MaritalStatus); // 如果数据库存的是婚姻状态的Key值,就按Key匹配 // SelectedMaritalStatus = MaritalStatusList.FirstOrDefault(m => m.Key == details.MaritalStatusId);
注意:必须保证赋值前ViewModel里的
MaritalStatusList已经完成初始化加载,否则会找不到匹配项。
可选优化
如果需要支持不同实例的匹配(比如数据源是重新请求的新列表),可以给KeyValuePair重写Equals和GetHashCode方法,让Picker按值匹配:
public class KeyValuePair { public int Key { get; set; } public string Value { get; set; } public override bool Equals(object obj) { if (obj is KeyValuePair other) { return Key == other.Key && Value == other.Value; } return false; } public override int GetHashCode() { return HashCode.Combine(Key, Value); } }
内容的提问来源于stack exchange,提问作者NickUK77
相关产品推荐
相关产品推荐

