这个问题以前可能已经问过很多次了,但我已经看到了太多的答案,我真的不知道该怎么做。
我有一个ListBox:
<listbox ItemSource="{Binding listitems}">
<ListBox.ItemTemplate>
<DataTemplate>
<grid>
<Textblock text="{Binding value1}">
<Textblock text="{Binding value2}">
</grid>
</DataTemplate>
</ListBox.ItemTemplate>
</listbox>
我有一个以下类的列表:
List<Items> listitems = new List<Items>();
public class Items
{
public string value1 { get; set; }
public string value2 { get; set; }
}有时,列表会更新(添加了更多元素),我想让列表框知道列表已经更新,并相应地更新UI。
此时,我手动将列表绑定到c#中的列表框,当它发生变化时,我清除列表框并重新添加列表,这并不是我们所希望的。
我想知道列表框是如何自动更新的?
发布于 2013-06-02 21:02:42
使用ObservableCollection代替一般的List<T>,它在内部实现了负责更新UI上元素的INotifyCollectionChanged接口。
ObservableCollection<Items> listitems = new ObservableCollection<Items>();编辑
ListItems必须为property。你不能用field绑定它-
ObservableCollection<Items> listitems = new ObservableCollection<Items>();
public ObservableCollection<Items> Listitems
{
get
{
return listitems;
}
set
{
listItems = value;
}
}XAML -
<Listbox ItemSource="{Binding Listitems}">发布于 2013-06-02 21:07:39
您必须将List更改为ObservableCollection,并根据MVVM模式实现所有内容。
public ObservableCollection<Items> Listitems
{
get { return _listitems ; }
set
{
_listitems = value;
RaisePropertyChanged(() => Listitems );
}
}您必须对Items中的每个属性执行相同的操作。也可以使用Prism进行绑定。你可以在网上找到很多不错的教程,比如this
发布于 2013-06-02 21:44:11
如果你使用List,那么你必须使用INotifypropertyChanged来通知,否则你可以使用ObservableCollection。
还必须使用NotifyOnSourceUpdated=True。
https://stackoverflow.com/questions/16882952
复制相似问题