为什么组合框绑定不能用于列表< >

本文关键字:列表 用于 不能 组合 绑定 为什么 | 更新日期: 2023-09-27 18:11:50

我试图在WPF中像这样绑定一个组合框,

<ComboBox Width="350" Margin="5" IsEditable="True" ItemsSource="{Binding ComboboxItems}" DisplayMemberPath="Name">
public List<ExpandoObject> ComboboxItems
{
    get
    {
        return comboboxItems;
    }
}

如果我在视图模型中这样设置列表,

comboboxItems.Clear();
foreach (ExpandoObject comboboxItem in repository.LoadComboboxItems())
{
    comboboxItems.Add(comboboxItem);
}
NotifyPropertyChanged(this, x => x.ComboboxItems);

NotifyPropertyChanged似乎有效,因为击中了ComboboxItems上的断点,但随后在GUI上不更新组合框列表。Snoop没有显示绑定错误或类似的东西。

上面的列表第一次更新它似乎工作,所以它不能与使用ExpandoObject有任何关系,我不认为。

更新:

使用一个可观察集合工作,但我想知道如果我有一个setter在视图模型像这样绑定到GUI上的控件,

public string Database
{
    get
    {
        return importData.Database;
    }
    set
    {
        importData.Database = value;
        NotifyPropertyChanged(this, x => x.Database);
        comboboxItems.Clear();
        foreach (ExpandoObject comboboxItem in repository.LoadComboboxItems())
        {
            comboboxItems.Add(comboboxItem);
        }
        NotifyPropertyChanged(this, x => x.ComboboxItems);
   }
}

setter是否在后台线程上运行?我问的原因是,如果需要一段时间才能从数据库加载项目,setter会阻塞GUI吗?

这是我第一次尝试使用ObservableCollection时出错的地方,通过在后台线程上使用BackgroundWorker的setter中运行代码。在这些条件下,更新ObservableCollection会导致异常

为什么组合框绑定不能用于列表< >

我认为如果你使用ObservableCollection<>而不是List<>,它将工作。除非你使用ObservableCollection,否则xaml不会知道列表的内容发生了变化。

回答你问题的第二部分,如果你试图直接使用BackgroundWorker设置ObservableCollection,你会得到一个异常。绕过异常的一种方法是使用BeginInvoke

设置ObservableCollection。

有一点需要注意:你不需要在setter中调用NotifyPropertyChanged(this, x => x.ComboboxItems);。这是因为属性没有改变;属性是一个集合,集合内容正在更改。ObservableCollection将通知订阅者内容已经更改

使用ObservableCollection代替List。

引用MSDN:

可以枚举任何实现IEnumerable的集合接口。但是,要设置动态绑定,以便插入或集合中的删除会自动更新UI集合必须实现INotifyCollectionChanged接口。这接口公开了CollectionChanged事件,该事件应该是当基础集合发生更改时引发。

WPF提供了ObservableCollection类,这是一个内置的的数据集合的实现INotifyCollectionChanged接口。

在实现自己的集合之前,请考虑使用ObservableCollection或现有的集合类之一,例如List、Collection和BindingList等。如果您有一个高级的场景,并希望实现您自己的集合时,可以考虑使用IList,它提供了一个非泛型的可以通过索引单独访问的对象集合。实现IList可以通过数据绑定提供最佳性能引擎。