【问题标题】:Data-Binding: Display a list of strings数据绑定:显示字符串列表
【发布时间】:2013-11-30 18:18:17
【问题描述】:

我有一个名为 Track 的类:

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

}

这个类包含一个 Artist 对象列表:

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>

我使用 Track 对象的 List 来填充这个 GridView:

TracksList.ItemsSource = album.TrackCollection;

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

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

【问题讨论】:

标签: c# wpf gridview data-binding


【解决方案1】:

您可以像这样使用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}}" 

【讨论】:

    【解决方案2】:

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

    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();
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      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; }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        • 1970-01-01
        • 2017-11-03
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多