将列表集合值添加到String以显示在listview中?

时间:2015-01-30 17:22:40

标签: c#

我正在尝试获取列表的值并将它们写入可以在列表视图中显示的字符串。在我的情况下,我正在检索每个都有艺术家列表的音乐发布列表。

这是我的班级:

class DownloadsAvailable
{
    OAuth oAuth = new OAuth();
    public Metadata metadata { get; set; }
    public List<DownloadsAvailableResult> results { get; set; } // List of Songs
    public IEnumerator<DownloadsAvailableResult> GetEnumerator()
    {
        return this.results.GetEnumerator();
    }
}

public class DownloadsAvailableResult // Song
{
    public int id { get; set; }
    public string name { get; set; }
    public string title { get; set; }
    public List<Artist> artists { get; set; }
    public string artistsList { get; set; } // New property to hold string list of artists
}
public class Artist
{
    public int id { get; set; }
    public string name { get; set; }
    public string slug { get; set; }
    public string type { get; set; }
}

背后的代码

private async void GetDownloads()
    {
        OAuth oAuth = new OAuth();

        string oAuthVerifier = ApplicationData.Current.LocalSettings.Values["oauth_verifier"].ToString();
        string httpMethod = "GET";
        string parameters = "status=" + DownloadStatus.available.ToString();
        string response = await oAuth.GetData(OAuth.availDownloadsUrl, httpMethod, parameters, oAuthVerifier);
        DownloadsAvailable downloads = JsonConvert.DeserializeObject<DownloadsAvailable>(response);

        // Foreach loop here to enumerate over list of artists?

        this.listDownloads.ItemsSource = downloads;
    }

我不知道如何枚举艺术家列表,所以我可以将它们加入到一个字符串中,我可以将其绑定到列表视图中的文本块。

感谢您的帮助。

更新 谢谢大家的答案,但我想我没有清楚地解释我的问题。我从web请求获得的数据返回一个歌曲列表。每首歌可以有多位艺术家。我想要做的是为每首歌创造一系列艺术家。然后能够将其绑定到列表视图中的文本块。

目前我已经通过嵌套两个列表视图完成了这样做:

<ListView x:Name="listDownloads" ItemsSource="{Binding DownloadsAvailable}" SelectionChanged="listDownloads_SelectionChanged" HorizontalAlignment="Left" Height="auto" VerticalAlignment="Top" Width="auto">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="2*"/>
                            </Grid.ColumnDefinitions>
                            <Image Source="{Binding images.large.url}" Grid.Column="0" Margin="0,10,0,0" />
                            <StackPanel Grid.Column="1" VerticalAlignment="Top" Margin="20,0,0,0">
                                <TextBlock Text="{Binding title}" Style="{StaticResource ListViewItemContentTextBlockStyle}" />
                                <TextBlock Text="{Binding release.name}" Style="{StaticResource ListViewItemSubheaderTextBlockStyle}"/>
                                <ListBox ItemsSource="{Binding artists}" ScrollViewer.VerticalScrollBarVisibility="Disabled">
                                    <ListBox.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <StackPanel Orientation="Horizontal"/>
                                        </ItemsPanelTemplate>
                                    </ListBox.ItemsPanel>
                                    <ListBox.ItemTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding name}" Margin="2"/>
                                        </DataTemplate>
                                    </ListBox.ItemTemplate>
                                </ListBox>
                            </StackPanel>
                        </Grid>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

因此,我不想使用嵌套列表框来显示单首歌曲的艺术家,而是希望能够为每首歌曲设置一系列艺术家并将其绑定到文本块。

我希望这可以解决问题。感谢。

4 个答案:

答案 0 :(得分:2)

已更新

根据您的更新,对于每首歌曲,您希望将该歌曲的艺术家列表合并为一个字符串。也就是说,您希望将每首歌曲(DownloadsAvailableResult)中的一个这样的字符串存储到属性中。这使事情变得更简单,因为每首歌已经知道它自己的List<Artist>

foreach (var song in downloads.results)
{
   //Turn the list of artists into collection of names (strings)
   var artistNameCollection = song.artists.Select(artist => artist.name);

   //Assign to the property using String.Join to combine the collection
   song.artistsList = String.Join(", ", artistNameCollection);
}

答案 1 :(得分:1)

String.Join接受要加入的字符串数组。因此,从艺术家名称创建这样的数组:

public string artistsList {
    get {
        return String.Join(", ", artists.Select(a => a.name).ToArray());        
    }
}

你真的想要一个二传手吗?你可以用逗号分隔的艺术家名单来做到这一点;然而,艺术家的其他属性将会缺失。

    set {
        artists = value.Split(',')
            .Select(s => new Artist{ name = s.Trim() })
            .ToList();
    }

答案 2 :(得分:1)

这样的事情对你有用吗?

string artistNames = string.Join(", ", 
    downloads.results.SelectMany(r => r.artists.Select(a => a.name)));

<强>更新

我之前没有注意到你artistsList班的DownloadsAvailableResult属性。如果它只包含艺术家名称,您可以考虑重命名它,并且您可以通过提供如下的get方法使其成为只读属性:

public class DownloadsAvailableResult
{
    // Other properties here

    // Just return the names, don't allow this to be set by user 
    // (to add an artist name, add an Artist to the artists List)
    public string artistNames
    {
        get
        {
            return (artists == null)
                ? string.Empty // <-- or something like: "<No Artist Info Available>"
                : string.Join(", ", artists.Select(a => a.name));
        }
    }
}

答案 3 :(得分:0)

这是一个例子 - 假设我有一个List,该列表的内容如下

  • valList [0] =&#34;状态不能为空&#34;
  • vlaList [1] =&#34;这是Test&#34;

declaration of the my List<T> variable

var valList = new List<string>
{
   "Status can not be empty",
   "This is a Test"
};
var msgString = string.Join(", " , valList);
  • msgString将保留以下值 - 请参阅下面的

StatusCode can not be Empty, Service Requester Contract can not be Empty