在datagridcolumn单元格中显示ICollection

时间:2014-03-12 20:12:39

标签: c# wpf

所以我有一个专栏和#34;标签"它由一个人的属性组成。例如,一个名为BoB的人,并且有这样的标签[Funny,Nice,Outgoing]。我能够过滤Datagrid搜索标签。我只能显示第一个。我的问题是我希望一次能够显示多个标签。

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

视图模型:

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

Datatemplate Trial:

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

1 个答案:

答案 0 :(得分:2)

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

更新:要显示集合,您需要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以获取使用此课程所需的其他信息。