WPF MVVM模式下ListBox不显示数据问题求助
WPF MVVM ListBox无数据加载问题修复
核心问题分析
- ViewModel实例重复创建:MainWindow构造函数中先初始化了一个带数据的ViewModel,但随后又新建了一个空实例赋值给DataContext,导致ListBox绑定的是空集合。
- SelectedItem类型错误:ViewModel中SelectedItem定义为
ObservableCollection<string>,但ListBox的SelectedItem对应单个选中项,应改为string类型。 - 绑定模式冗余:ItemsSource使用
TwoWay模式无意义,集合绑定默认OneWay即可。
修正后的代码
MainWindow.xaml.cs
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var model = new Listboxviewmodel(); model.Items.Add("orange"); model.Items.Add("apple"); model.Items.Add("grapes"); this.DataContext = model; } }
Listboxviewmodel.cs
namespace WpfApp2 { public class Listboxviewmodel : INotifyPropertyChanged { private ObservableCollection<string> _items = new ObservableCollection<string>(); private string _selectedItem; public ObservableCollection<string> Items { get => _items; set { _items = value; SetPropertyChanged(nameof(Items)); } } public string SelectedItem { get => _selectedItem; set { _selectedItem = value; SetPropertyChanged(nameof(SelectedItem)); } } public event PropertyChangedEventHandler PropertyChanged; public void SetPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
MainWindow.xaml(优化绑定模式)
<Window.DataContext> <local:Listboxviewmodel/> </Window.DataContext> <Grid> <ListBox Width="100" Height="100" ItemsSource="{Binding Items, Mode=OneWay}" SelectedItem="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> </ListBox> </Grid> </Window>
说明
- 确保ViewModel实例唯一,数据添加到绑定的实例中
- SelectedItem类型匹配单个字符串项,保证选中功能正常
- 优化绑定模式减少不必要的资源消耗
内容的提问来源于stack exchange,提问作者mili
相关产品推荐
相关产品推荐

