问题 WPF:将列表绑定到ListBox


我上课了:

public class A : INotifyPropertyChanged
{
    public List<B> bList { get; set; } 

    public void AddB(B b)
    {
        bList.Add(b);
        NotifyPropertyChanged("bList");
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

和绑定(UserControl的DataContext是A的一个实例):

<ListBox ItemsSource="{Binding Path=bList}" />

显示元素,将新对象添加到List后ListBox不会更新

将列表更改为ObservableCollection并删除NotifyPropertyChanged处理程序后,一切正常。

为什么列表不起作用?


1551
2018-05-19 11:59


起源

请发布您的真实代码...即使使用ObservableCollection,您发布的代码也无法正常工作。并且NotifyPropertyChanged没有任何改变,因为你没有使用它 - Thomas Levesque


答案:


你的财产必须是 public,或绑定引擎将无法访问它。


编辑:

将列表更改为ObservableCollection并删除NotifyPropertyChanged处理程序后,一切正常。

这正是为什么 ObservableCollection<T> 上课了...... ObservableCollection<T> 器物 INotifyCollectionChanged,允许它在添加/删除/替换项目时通知UI。 List<T> 不会触发任何通知,因此UI无法检测列表内容何时发生更改。

事实上你提高了 PropertyChanged 事件确实刷新了绑定,但后来它意识到它是同一个实例 List<T> 和以前一样,所以重复使用它 ICollectionView 作为 ItemsSource,以及的内容 ListBox 没有刷新。


15
2018-05-19 12:04



谢谢,它是公开的,我忘了在代码中写它。现在代码已更改 - Damian
@Damian,请看我更新的答案 - Thomas Levesque
谢谢你的答案:) - Damian
谢谢解释原因 ObservableCollection 在数据绑定中很有用。 - ebhh2001


首先想到的是你正试图绑定到私人成员。这当然不对。


0
2018-05-19 12:05



谢谢,它是公开的,我忘了在代码中写它。现在代码已更改 - Damian


我认为问题是,虽然您通知绑定框架该属性已更改,但该属性的实际值仍然相同。也就是说虽然列表框可能会重新评估其ItemsSource绑定的值,但它会发现它仍然是相同的 对象实例 如从前那样。例如,假设列表框以某种方式对属性更改事件作​​出反应,类似于下面的内容。

private void OnItemsSourceBindingChanged()
{
    var newValue = this.EvaluateItemsSourceBinding();
    if (newValue != this.ItemsSource) //it will be equal, as its still the same list
    {
        this.AddNewItems();
    }
}

在您的示例中,这意味着它不会重新评估项目。

注意:我没有 知道 列表框如何与ItemsSource属性一起使用 - 我只是在猜测!


0
2018-05-19 12:23





ObservableCollections发送 CollectionChanged 事件不是PropertyChanged事件


0
2018-05-19 12:25





通过信号

NotifyPropertyChanged("bList");

你基本上说你有一个新的 名单 对象,而不是列表的内容已更改。

如果将类型更改为ObservableCollection,则集合会自动发送

CollectionChanged

该集合的通知 项目 已经改变了,这就是你想要的。


0
2018-05-19 13:12