ItemsSource绑定到集合保持为空

时间:2015-06-22 20:48:12

标签: c# wpf xaml mvvm

我有一个 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 也会触发。
感谢

1 个答案:

答案 0 :(得分:1)

为了观察集合中的更改,WPF提供了实现INotifyCollectionChangedINotifyPropertyChanged的{​​{3}}类。将List<T>替换为ObservableCollection<T>,您的代码应该有效。