2015-06-22 4 views
0

У меня есть класс YouTubeVideo, который содержит некоторые переменные, которые я хотел бы показать в пользовательском интерфейсе. Поэтому я создал настраиваемый элемент управления, который отображает все данные класса. Существует несколько экземпляров класса, поэтому я хотел бы использовать элемент ItemsControl для отображения их на экране, как в StackPanel. Я определил ViewModel для ItemsControl, и я добавляю пользовательские элементы управления из моего окна кода в ViewModel, однако ItemsControl остается пустым.ItemsSource привязка к коллекции остается пустой

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> 

из окна кода позади я установить DataContext для ItemsControl к ViewModel в конструкторе:
InitializeComponent(); videoInfoList.DataContext = new VideoInfoListModel();

Я отлаживал ViewModel, и я вижу, что мои пользовательские элементы добавляются в коллекцию успешно, PropertyChanged также срабатывает.
Благодаря

+3

Попробуйте изменить 'List' на' ObservableCollection' –

+0

@NedStoyanov, пожалуйста, добавьте его в качестве ответа, как вы, где сначала. Благодарю вас обоих! Проведите много времени в этом. – Kimmax

ответ

1

Для того, чтобы наблюдать изменения в коллекции WPF предоставляет ObservableCollection класс, который реализует INotifyCollectionChanged и INotifyPropertyChanged. Замените List<T> на ObservableCollection<T>, и ваш код должен работать.

Смежные вопросы