簡體   English   中英

WPF:將列表綁定到ListBox

[英]WPF: Binding List to 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處理程序后,一切正常。

為什么列表不起作用?

您的財產必須是 public ,否則綁定引擎將無法訪問它。


編輯:

將列表更改為ObservableCollection並刪除NotifyPropertyChanged處理程序后,一切正常。

這正是引入ObservableCollection<T>類的原因...... ObservableCollection<T>實現了INotifyCollectionChanged ,它允許它在添加/刪除/替換項目時通知UI。 List<T>不會觸發任何通知,因此UI無法檢測列表內容何時發生更改。

提升PropertyChanged事件的事實確實刷新了綁定,但后來它意識到它與之前的List<T>實例相同,因此它重用了與ItemsSource相同的ICollectionView ,並且ListBox的內容沒有刷新。

首先想到的是你試圖綁定到私人成員。 這當然不對。

我認為問題是,雖然您通知綁定框架該屬性已更改,但該屬性的實際值仍然相同。 也就是說,雖然列表框可能會重新評估其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屬性一起使用 - 我只是在猜測!

ObservableCollections發送CollectionChanged事件而不是PropertyChanged事件

通過信號

NotifyPropertyChanged("bList");

你基本上說你有一個新的列表對象,而不是列表的內容已經改變。

如果將類型更改為ObservableCollection,則集合會自動發送

CollectionChanged

集合已更改的通知,這是您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM