数据绑定:显示字符串列表



我有一个名为Track:的类

public class Track
{
    public string Title { get; set; }      
    public List<Artist> Artists { get; set; }
}

此类包含艺术家对象列表:

public class Artist
{
    public string Name { get; set; }
}

现在我想将其绑定到WPF:中的GridView

 <ListView x:Name="TracksList" Margin="37,325,33,0" VerticalAlignment="Top" Grid.ColumnSpan="1" MouseDoubleClick="TrackList_MouseDoubleClick" Foreground="#FFDEDEDE" Background="#FF232323">
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding Title}" Width="400px" Header="Titel" />
                    <GridViewColumn DisplayMemberBinding="{Binding Artists}" Width="200px" Header="Artists" />     
                </GridView> 
            </ListView.View>
        </ListView>

我使用跟踪对象列表来填充此GridView:

TracksList.ItemsSource = album.TrackCollection;

我想要实现的是在"艺术家"列中显示一个包含所有艺术家名称的字符串(例如"艺术家1、艺术家2、艺术家3")。我得到的是一个字符串,解释这个字段包含一个列表。我确实理解为什么会得到这样的结果:我没有告诉绑定如何解析和显示列表。

如何配置绑定,以便在列字段中显示艺术家列表。

您可以使用像这样的Binding.Converter:

class ArtistsListConverter : IValueConverter
{
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        object result = null;
        var artists = value as IEnumerable<Artist>;
        if (artists != null)
        {
            result = string.Join(", ", artists.Select(a => a.Name));
        }
        return result;
    }
    public object ConvertBack(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

XAML:

<local:ArtistsListConverter x:Key="ArtistsListConverter"/>
...
DisplayMemberBinding="{Binding Artists,
                       Converter={StaticResource ArtistsListConverter}}" 

如果绑定了艺术家列表,转换器实际上只会得到它。所以,这是转换器的一个稍微即兴的版本。

public class ArtistsToStringConverter : System.Windows.Data.IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var artists = value as IEnumerable<Artist>;
        if (artists != null)
        {
            var artistNames = from artist in artists select artist.Name;
            return string.Join(", ", artistNames);
        }
        return null;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

这就是为什么有视图模型:

public class TrackViewModel
{
    public TrackViewModel(Track model)
    {
        Title = model.Title;
        Artists = string.Join(", ", model.Artists.Select(a => a.Name));
    }
    public string Title { get; private set; }
    public string Artists { get; private set; }
}

最新更新