<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 []属性,并且它更新正常。
答案 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>
接口,因此大多数方法都是共享的。)