包装类:
public class Multimedia : INotifyPropertyChanged
{
//... constructor
//... empty constructor
//... getters and setters for properties
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
收藏品:
public class MultiMediaList : ObservableCollection<Multimedia>
{
Multimedia mediaWrapper = new Multimedia();
//... constructor with creating several default objects of Multimedia
public void addMedia(string title, string artist, string genre, MediaType type)
{
this.Add(new Multimedia(title, artist, genre, type));
mediaWrapper.OnPropertyChanged("MultiMediaList");
}
}
这是我将ListBox绑定到ObservableCollection的方法: 代码隐藏:
public partial class MainWindow : Window
{
MultiMediaList mediaList;
public MainWindow()
{
InitializeComponent();
mediaList = new MultiMediaList();
LB_media.ItemsSource = mediaList;
}
}
XAML:
<ListBox Name="LB_media" DisplayMemberPath="Title" ... />
然而,当我在Collection中添加一个新条目时,ListBox不会更新。我试过调试,看看是否至少将新条目添加到Collection中 - 它是。
从我所做的研究和试训中,这对我来说都是正确的。任何想法,我错过了什么或做错了什么?
答案 0 :(得分:1)
如果你想要做的只是添加到列表中,那么你就不需要任何包装类或任何事件,因为ObservableCollection
已经实现了INotifyCollectionChanged
。
public class MultiMediaList : ObservableCollection<Multimedia>
{
//... constructor with creating several default objects of Multimedia
public void addMedia(string title, string artist, string genre, MediaType type)
{
this.Add(new Multimedia(title, artist, genre, type));
}
}
那就是它。保持MainWindow
原样。如果向表单添加按钮,
private void Button_Click(object sender, RoutedEventArgs e)
{
mediaList.addMedia("ccc", "ccc", "ccc", MediaType.Whatever);
}
会导致新项目自动显示。