WPF中ComboBox绑定ViewModel内List<string>无内容如何排查?
排查步骤
- 第一步:检查输出窗口的绑定错误日志
打开VS的「工具-选项-调试-输出窗口-WPF跟踪设置」,将数据绑定的输出级别调整为「警告」或「详细」,运行程序后查看输出窗口,是否存在绑定路径错误类的报错,这是最快定位绑定问题的方法。 - 第二步:核对绑定路径是否匹配
你当前XAML中ComboBox的ItemsSource绑定的是ViewModel中类型为ConditionsModel的Conditions属性,而真正存储字符串列表的是ConditionsModel类内部的Conditions子属性,所以当前绑定路径少了一层,指向的是类实例而不是列表。 - 第三步:检查属性变更通知是否触发
你在异步方法LoadInitialData中给Conditions属性赋值,如果你ViewModel的Conditions属性没有实现INotifyPropertyChanged通知,UI无法感知到异步赋值后的属性变更,自然不会更新渲染。 - 第四步:检查类和属性的访问权限
你当前定义的ConditionsModel没有加访问修饰符,默认是internal,如果UI层和ViewModel层不在同一个程序集,会导致绑定无法访问到内部类的属性。
修复方案
- 修正XAML绑定路径,指向内层的列表属性:
<ComboBox Grid.Row="5" ItemsSource="{Binding Conditions.Conditions}" SelectedItem="{Binding SelectedCondition}" />
- 给ViewModel的
Conditions属性添加属性变更通知(替换为你项目中的通知实现即可):
private ConditionsModel _conditions; public ConditionsModel Conditions { get => _conditions; set { _conditions = value; OnPropertyChanged(nameof(Conditions)); } }
- 优化
ConditionsModel的定义,避免每次Get都生成新列表,同时修改为public访问权限:
public class ConditionsModel { private List<string> _conditions = new List<string> { "New", "Excellent", "Good", "Fair", "Poor", "Unacceptable" }; public List<string> Conditions { get => _conditions; set { _conditions = value; } } }
内容的提问来源于stack exchange,提问作者Joshua White
相关产品推荐
相关产品推荐

