WPF. При биндинге к DataGrid, создаются строки но не заполняются данными
Есть следующий замл код :
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding Link}" Margin="5" ToolTip="Enter playlist id" Width="500" FontSize="20" VerticalContentAlignment="Center"/>
<Button Content="Parse" Margin="5" Padding="10,5" FontSize="20" Command="{Binding ParseCommand}"/>
</StackPanel>
<DataGrid Margin="5" Grid.Row="1" ItemsSource="{Binding InformationAboutSong}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Thumbnail" Width="200">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Song name" Width="260" />
<DataGridTextColumn Header="Artist name" Width="260" />
<DataGridTextColumn Header="Duration" Width="100"/>
</DataGrid.Columns>
</DataGrid>
<DataGrid Margin="5" Grid.Row="2" ItemsSource="{Binding InformationAboutPlaylist}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Playlist thumbnail" Width="300">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Playlist description" Width="*"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
К DataGrids я прибиндил два свойста из VM :
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private string _link;
public string Link
{
get { return _link; }
set { _link = value;
OnPropertyChanged("InformationAboutSong");
OnPropertyChanged("InformationAboutPlaylist");
}
}
private ObservableCollection<Track> _informationAboutSong;
private Playlist _informationAboutPlaylist;
public ObservableCollection<Track> InformationAboutSong
{
get => _informationAboutSong;
set
{
_informationAboutSong = value;
OnPropertyChanged(nameof(InformationAboutSong));
}
}
public Playlist InformationAboutPlaylist
{
get => _informationAboutPlaylist;
set
{
_informationAboutPlaylist = value;
OnPropertyChanged(nameof(InformationAboutPlaylist));
}
}
private ICommand _parseCommand;
public ICommand ParseCommand => _parseCommand ?? (_parseCommand = new RelayCommand(parameter =>
{
MainModel mm = new MainModel();
InformationAboutSong = mm.GetSongInfo(Link);
InformationAboutPlaylist = mm.GetPlaylistInfo(Link);
}));
}
Которые в свою очередь заполняются из методов GetSongInfo, GetPlaylistInfo :
public ObservableCollection<Track> GetSongInfo(string link)
{
string playlistId = link; // NEED PARSE
ObservableCollection<Track> informationAboutSong = null;
try
{
var yt = new YouTubeService(new BaseClientService.Initializer() { ApiKey = _APIKEY });
var channelRequest = yt.Playlists.List("snippet");
channelRequest.Id = playlistId;
var channelResponse = channelRequest.Execute();
Google.Apis.YouTube.v3.Data.Playlist playlist = channelResponse.Items[0];
var playlistItemsListRequest = yt.PlaylistItems.List("snippet");
playlistItemsListRequest.PlaylistId = playlistId;
playlistItemsListRequest.MaxResults = 50;
// Retrieve the list of videos uploaded to the authenticated user's channel.
var playlistItemsListResponse = playlistItemsListRequest.Execute();
informationAboutSong = new ObservableCollection<Track>();
foreach (var playlistItem in playlistItemsListResponse.Items)
{
WebClient myDownloader = new WebClient();
myDownloader.Encoding = System.Text.Encoding.UTF8;
string jsonResponse = myDownloader.DownloadString(
"https://www.googleapis.com/youtube/v3/videos?id=" + playlistItem.Snippet.ResourceId.VideoId + "&key="
+ _APIKEY + "&part=contentDetails");
dynamic dynamicObject = Json.Decode(jsonResponse);
string tmp = dynamicObject.items[0].contentDetails.duration;
var songDuration = Convert.ToInt32(System.Xml.XmlConvert.ToTimeSpan(tmp).TotalSeconds);
Track track = new Track()
{
ThumbnailUri = GetMaxResolution(playlistItem.Snippet.Thumbnails),
SongName = playlistItem.Snippet.Title,
ArtistName = playlist.Snippet.ChannelTitle,
Duration = $"{songDuration / 60}:{songDuration % 60}"
};
informationAboutSong.Add(track);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return informationAboutSong;
}
public Model.Playlist GetPlaylistInfo(string link)
{
string playlistId = link; // NEED PARSE
Model.Playlist informationAboutPlaylist = null;
try
{
var yt = new YouTubeService(new BaseClientService.Initializer() { ApiKey = _APIKEY });
var channelRequest = yt.Playlists.List("snippet");
channelRequest.Id = playlistId;
var channelResponse = channelRequest.Execute();
Google.Apis.YouTube.v3.Data.Playlist playlist = channelResponse.Items[0];
var playlistItemsListRequest = yt.PlaylistItems.List("snippet");
playlistItemsListRequest.PlaylistId = playlistId;
playlistItemsListRequest.MaxResults = 50;
// Retrieve the list of videos uploaded to the authenticated user's channel.
var playlistItemsListResponse = playlistItemsListRequest.Execute();
foreach (var playlistItem in playlistItemsListResponse.Items)
{
informationAboutPlaylist = new Model.Playlist() // Значения в каждом playlistItem одинаковы, по этому берём только 1 экземпляр (последний).
{
Thumbnail = GetMaxResolution(playlist.Snippet.Thumbnails),
Description = playlist.Snippet.Description
};
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return informationAboutPlaylist;
}
И при выполнении программы - в первом DataGrid создаются пустые строки, а во втором вообще ничего не происходит.