发生更改时,List <string>不会更新UI </string>

时间:2012-12-13 23:02:47

标签: c# wpf xaml binding

<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 []属性,并且它更新正常。

2 个答案:

答案 0 :(得分:4)

如果您不想使用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已经做了这个时没有任何意义为你

答案 1 :(得分:3)

如果您使用新的List<MyClass>替换整个列表,它目前只会更新。替换1项不会触发OnPropertyChanged事件。

使用ObservableCollection<MyClass>代替List<MyClass>。它专门用于处理此问题,并在集合中的项目发生更改时通知WPF。

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