C# WPF MVVM模式下ComboBox绑定数据源不显示选项问题
问题根因
ComboBox不显示选项是两个WPF绑定/视图映射的典型错误导致的:
- AccountView硬声明了独立DataContext,覆盖了传入的带数据的ViewModel实例
你在MainWindow中通过ContentControl绑定CurrentViewModel,传入的是登录逻辑中构造的、已经加载了Binance、Bitrue两个交易所数据的AccountViewModel实例。但你在AccountView的XAML中显式写了如下代码:
<UserControl.DataContext> <views:AccountViewModel/> </UserControl.DataContext>
这段代码会让AccountView自行初始化一个空参数构造的AccountViewModel作为数据上下文,这个空实例的AvaliableExchanges属性是null,ComboBox绑定自然拿不到任何数据。
2. 未配置ViewModel到View的隐式映射模板
你没有给ContentControl配置数据模板,WPF无法识别CurrentViewModel的AccountViewModel类型应该对应加载AccountView,默认只会调用ViewModel的ToString()方法渲染文本,根本不会加载你写的AccountView界面。
修复步骤
- 直接删除AccountView中上述显式声明
UserControl.DataContext的全部代码,UserControl不要硬编码自身的DataContext,应当继承父容器传递的上下文。 - 在MainWindow的XAML中添加
Window.Resources节点,配置ViewModel到View的隐式数据模板,让WPF自动完成视图映射:
<Window.Resources> <DataTemplate DataType="{x:Type vm:AccountViewModel}"> <views:AccountView/> </DataTemplate> </Window.Resources>
你已经在MainWindow中声明了vm对应ViewModels命名空间、views对应Views命名空间,直接添加上述代码即可,不需要额外引包。
修复后运行逻辑
- 点击登录按钮后,MainWindowViewModel从数据库拉取用户对应的交易所数据,构造带数据的AccountViewModel实例赋值给
CurrentViewModel - ContentControl检测到绑定的Content是AccountViewModel类型,自动匹配数据模板加载AccountView控件
- AccountView直接继承ContentControl传递的DataContext,也就是带数据的AccountViewModel实例,ComboBox的ItemsSource绑定可以正确读取到AvaliableExchanges集合的两个值,下拉选项正常显示。
注:你代码中属性名
AvaliableExchanges存在拼写错误(正确拼写为AvailableExchanges),但只要绑定路径和属性名拼写完全一致就不会影响功能,可自行决定是否修正。
内容的提问来源于stack exchange,提问作者Александр
相关产品推荐
相关产品推荐

