我有一个 YouTubeVideo 类,其中包含一些我希望在UI上显示的变量。因此,我创建了一个自定义控件,显示该类的所有数据。该类有多个实例,因此我想使用ItemsControl在屏幕上显示它们,就像在StackPanel中一样。我为ItemsControl定义了一个ViewModel,并且我将自定义用户控件从我的窗口代码添加到ViewModel,但ItemsControl保持为空。
ViewModel
public class VideoInfoListModel : INotifyPropertyChanged
{
private List<VideoInfoListItem> _loadedVideos = new List<VideoInfoListItem>();
public List<VideoInfoListItem> LoadedVideos
{
set {
_loadedVideos = value;
NotifyPropertyChanged("LoadedVideos");
}
get { return _loadedVideos; }
}
public void AddVideo(YouTubeVideo video)
{
LoadedVideos.Add(new VideoInfoListItem(video));
NotifyPropertyChanged("LoadedVideos");
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
ItemsSource XAML
<ItemsControl ItemsSource="{Binding LoadedVideos, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" x:Name="videoInfoList" Margin="0">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
从后面的窗口代码我将ItemsControl的datacontext设置为构造函数中的ViewModel:
InitializeComponent();
videoInfoList.DataContext = new VideoInfoListModel();
我调试了ViewModel,我可以看到我的usercontrols已成功添加到集合中, PropertyChanged 也会触发。
感谢
答案 0 :(得分:1)
为了观察集合中的更改,WPF提供了实现INotifyCollectionChanged
和INotifyPropertyChanged
的{{3}}类。将List<T>
替换为ObservableCollection<T>
,您的代码应该有效。