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 создаются пустые строки, а во втором вообще ничего не происходит.


Ответы (0 шт):