1
<ListBox x:Name="MainList" HorizontalAlignment="Left" Height="468" Margin="10,10,0,0" VerticalAlignment="Top" Width="100" ItemsSource="{Binding Items,Mode=TwoWay}" DisplayMemberPath="Name"/>



[Serializable()]
public class MYcontainer : INotifyPropertyChanged,ISerializable
{
    private List<MYClass> _items = new List<MYClass>();
    public List<MYClass> Items
    {
        get{ return _items;}
       set { this._items =value;
        OnPropertyChanged("Items");
    }
public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName = null)
    {
        var eventHandler = this.PropertyChanged;
        if (eventHandler != null)
            eventHandler(this, new PropertyChangedEventArgs(propertyName));
    }  
}

当我将一个项目添加到“项目”时,UI 不会更新,绑定工作正常,因为如果我关闭窗口并再次打开它,新项目会正确显示。

我究竟做错了什么?我知道如果我使用ObservableCollection它会正常工作,但它不应该使用List<>吗?我已经在另一个窗口中有一个 string[] 属性,它更新得很好。

4

2 回答 2

5

如果您不想使用,ObservableCollection则必须实施INotifyCollectionChanged.

public partial class MainWindow : Window, INotifyCollectionChanged
{

    public event NotifyCollectionChangedEventHandler CollectionChanged;

    public MainWindow()
    {
        InitializeComponent();
    }


    public void NotifyCollectionChanged(NotifyCollectionChangedAction action)
    {
        if (CollectionChanged != null)
        {
            CollectionChanged(this, new NotifyCollectionChangedEventArgs(action));
        }
    }
}

但是ObservableCollection,这一切都为您服务,向您添加所有相同的逻辑List<T>只会创建一个自定义ObservableCollection,当 MS 已经为您做了这个时,我认为这没有任何意义

于 2012-12-13T23:23:18.100 回答
4

目前只有当您将整个列表替换为新的List<MyClass>. 替换 1 项不会触发OnPropertyChanged事件。

使用 aObservableCollection<MyClass>而不是 a List<MyClass>。它专为处理此问题而构建,并在集合中的项目发生更改时通知 WPF。

它在其他方面与 list 非常相似,因此对代码的更改应该是最小的(List 和 ObservableCollection 都实现了ICollection<T>接口,因此大多数方法都是共享的)。

于 2012-12-13T23:06:57.293 回答