当ItemsSource更改时,ComboBox不更新

本文关键字:ComboBox 更新 ItemsSource | 更新日期: 2023-09-27 18:17:35

我有一个绑定到List<string>的组合框。当列表更改时,即使引发PropertyChanged, ComboBox也不会更改。在调试时,我发现List Property甚至被读取了。

这个错误可以用下面的代码重现:

XAML

<Window x:Class="ComboBoxTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="90" Width="400">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ComboBox ItemsSource="{Binding Source, Mode=OneWay}"/>
        <Button Grid.Column="1" Content="add string" Command="{Binding}" CommandParameter="Add"/>
    </Grid>
</Window>

背后代码
using System.Windows;
namespace ComboBoxTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new ViewModel();
        }
    }
}

视图模型

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Input;
namespace ComboBoxTest
{
    class ViewModel : INotifyPropertyChanged, ICommand
    {
        public ViewModel()
        {
            Source = new List<string>();
            Source.Add("Test1");
            Source.Add("Test2");
            Source.Add("Test3");
        }
        private List<string> _Source;
        public List<string> Source
        {
            get { return _Source; }
            set
            {
                _Source = value;
                OnPropertyChanged("Source");
            }
        }
        private void OnPropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public bool CanExecute(object parameter)
        {
            return true;
        }
        public event System.EventHandler CanExecuteChanged;
        public void Execute(object parameter)
        {
            if ((string)parameter == "Add")
            {
                Source.Add("New string");
                OnPropertyChanged("Source");
            }
        }
    }
}

为什么组合框不更新?

当ItemsSource更改时,ComboBox不更新

ComboBox不更新,因为它在检查列表时没有看到任何更改。引用保持不变,并且不会通知ComboBox关于列表内部的更改。

重构代码使用ObservableCollection代替List将解决问题,因为ObservableCollection实现了INotifyCollectionChanged,有必要通知视图关于对象内部的变化

相关文章: