WPF:DataContext绑定ItemsSource失效,直接赋值却生效,原因何在?
问题原因分析及解决方案
这个问题的核心原因其实很直白:WPF的数据绑定系统只能识别并绑定到公共属性(Public Property),而你ViewModel里的Items是一个字段(Field),并非属性。
具体拆解两种场景的差异:
当你在XAML里写
{Binding Path=Items}时,WPF会通过反射机制去查找DataContext对象中名为Items的公共属性。但你的代码里Items是直接声明的字段:public class ViewModel { public ObservableCollection<string> Items; }这种情况下绑定系统找不到对应的属性,自然无法把数据加载到ItemsControl中。
而你直接执行
this.itemsControl.ItemsSource = this.MyViewModel.Items时,是通过C#代码直接访问字段,这属于普通的字段引用操作,完全不受数据绑定的属性限制,所以能正常把集合赋值给控件。
修复方案
把ViewModel里的Items改成公共属性即可,推荐用自动属性的写法,顺便初始化集合还能避免空引用问题:
public class ViewModel { public ObservableCollection<string> Items { get; set; } = new ObservableCollection<string>(); }
额外小建议:如果后续需要替换整个Items集合实例时也能通知UI更新,那ViewModel最好实现INotifyPropertyChanged接口,给Items属性添加变更通知逻辑,这样绑定的灵活性会更强。
内容的提问来源于stack exchange,提问作者trinvh
相关产品推荐
相关产品推荐

