在数据列单元格中显示集合

本文关键字:显示 集合 单元格 数据 | 更新日期: 2023-09-27 17:49:57

所以我有一个叫做"Tags"的列,它由一个人的属性组成。例如,一个叫BoB的人有这样的标签[有趣,好,外向]。我能够过滤数据网格搜索标签。我只能显示第一个。我的问题是,我希望能够一次显示多个标签。

TagDataGrid TagAttributes

Person.cs

public class Person
{...
    public virtual ICollection<Tags> Tags { get; set; } 
...}

Tags.cs

public class Tags
{....
    public string Tag { get; set; } 
....}

PersonDTO.cs

public class PersonDTO : IDTO
{....
    public string Tag { get; set; } 
....}

ViewModel:

using (var ctx = DB.Get()) 
{
    Items.AddRange(ctx.People.Select(x => new PersonDTO
    {.... 
        Tags = x.Tags.FirstOrDefault().Tag
    ....}
}

Datatemplate试验:

<telerik:GridViewDataColumn.CellTemplate>
  <DataTemplate>
       <StackPanel Orientation="Vertical">
            <TextBlock Text="{Binding Tags.Tag}"></TextBlock>
       </StackPanel>
  </DataTemplate>
</telerik:GridViewDataColumn.CellTemplate>

在数据列单元格中显示集合

您可以使用DataGridTemplateColumn并创建用于显示列表的模板,或者实现IValueConverter以编程方式将列表转换为单个字符串(使用string。(例如Join)。

Update:为了显示一个集合,您需要一个ItemsControl—例如,ListBox。像这样:

<telerik:GridViewDataColumn.CellTemplate>
  <DataTemplate>
    <ListBox ItemsSource="{Binding}"/>
  </DataTemplate>
</telerik:GridViewDataColumn.CellTemplate>

使用IValueConverter:

public class JoinArrayConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var col = value as ICollection<Tags>;
        if(col==null)
          throw new InvalidArgumentException("Expected a ICollection<Tags>");
        return string.Join(", ",col.ToArray());
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException(); // No one ever implement this one :)
    }
}

值转换器将原始值(集合)转换为新值(字符串)。这样就可以使用常规文本列。查看MSDN以获取使用该类所需的其他信息