【问题标题】:WPF: Binding List to ListBoxWPF:将列表绑定到列表框
【发布时间】:2011-08-28 20:00:36
【问题描述】:

我有一堂课:

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 处理程序后一切正常。

为什么列表不起作用?

【问题讨论】:

  • 请发布您的真实代码...您发布的代码无法工作,即使使用 ObservableCollection。 NotifyPropertyChanged 没有任何改变,因为你没有使用它

标签: c# wpf binding listbox observablecollection


【解决方案1】:

通过信号

NotifyPropertyChanged("bList");

你基本上是说你有一个新的 list 对象,而不是 List 的内容发生了变化。

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

CollectionChanged

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我认为问题在于,尽管您正在通知绑定框架该属性已更改,但该属性的实际值保持不变。也就是说,虽然列表框可能会重新评估它的ItemsSource绑定的值,但它会发现它还是和之前一样的object instance。例如,假设列表框对属性更改事件的反应与以下类似。

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

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

      注意:我不知道列表框如何与 ItemsSource 属性一起工作 - 我只是在猜测!

      【讨论】:

        【解决方案4】:

        您的属性必须是public,否则绑定引擎将无法访问它。


        编辑:

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

        这正是引入 ObservableCollection&lt;T&gt; 类的原因...ObservableCollection&lt;T&gt; 实现了 INotifyCollectionChanged,它允许它在添加/删除/替换项目时通知 UI。 List&lt;T&gt; 不会触发任何通知,因此 UI 无法检测到列表内容何时发生变化。

        您引发PropertyChanged 事件的事实确实刷新了绑定,但随后它意识到它与以前一样是List&lt;T&gt; 的同一实例,因此它重用了与ICollectionView 相同的ICollectionView,并且ListBox 的内容未刷新。

        【讨论】:

        • 谢谢,是公开的,忘记写在代码里了。现在代码变了
        • 感谢解释为什么ObservableCollection 在数据绑定中很有用。
        【解决方案5】:

        首先想到的是您正在尝试绑定到私有成员。那肯定是不对的。

        【讨论】:

        • 谢谢,是公开的,忘记写在代码里了。现在代码变了
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-07
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 2014-11-05
        • 1970-01-01
        • 2017-09-22
        相关资源
        最近更新 更多