首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字典动态绑定列到Silverlight DataGrid

从字典动态绑定列到Silverlight DataGrid
EN

Stack Overflow用户
提问于 2011-07-30 19:04:58
回答 1查看 2.4K关注 0票数 2

我希望将对象集合绑定到Silverlight中的DataGrid。这些对象属于以下类型:

代码语言:javascript
复制
public class Seats
{
    Dictionary<Group, long> dctValues = new Dictionary<Group, long>();

    public int Id { get; set; }

    public Dictionary<Group, long> Values
    {
        get { return dctValues; }
    }
}

鉴于该集团的代表有:

代码语言:javascript
复制
public class Group
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我希望能够根据组字典生成列,其中每个列的标题设置为Group.Name,每个项的单元格值等于字典中的长值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-30 21:17:31

我将假设我们不能保证每个组名称只有一个Group类的实例。(否则,您将根据已知组no的列表生成列?)

下面是一个从DataGrid派生的类

代码语言:javascript
复制
public class SeatsGrid : DataGrid, IValueConverter
{
    public SeatsGrid()
    {
        AutoGenerateColumns = false;
    }
    #region public List<Seats> SeatsList

    public List<Seats> SeatsList
    {
        get { return GetValue(SeatsListProperty) as List<Seats>; }
        set { SetValue(SeatsListProperty, value); }
    }

    public static readonly DependencyProperty SeatsListProperty =
        DependencyProperty.Register(
            "SeatsList",
            typeof(List<Seats>),
            typeof(SeatsGrid),
            new PropertyMetadata(null, OnSeatsListPropertyChanged));

    private static void OnSeatsListPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        SeatsGrid source = d as SeatsGrid;
        List<Seats> value = e.NewValue as List<Seats>;
        source.OnSeatsListPropertyChanged(value);
    }

    private void OnSeatsListPropertyChanged(List<Seats> value)
    {
        ItemsSource = null;
        Columns.Clear();

        var groups = value
            .SelectMany(seats => seats.Values.Keys)
            .Select(g => g.Name)
            .Distinct();

        foreach (var group in groups)
        {
            DataGridTextColumn col = new DataGridTextColumn();
            col.Binding = new Binding()
            {
                Converter = this,
                ConverterParameter = group
            };
            col.Header = group;
            Columns.Add(col);
        }

        ItemsSource = value;
    }
    #endregion public List<Seats> SeatsList

    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Seats seats = (Seats)value;
        string group = (string)parameter;

        Group actualGroup = seats.Values.Keys.FirstOrDefault(g => g.Name == group);
        if (actualGroup != null)
        {
            return seats.Values[actualGroup].ToString();
        }
        else
        {
            return null;
        }
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

将该类的实例放置在Xaml中,并将List<Seats>分配给其SeatsList属性,然后生成列并呈现行。

它是如何工作的?

魔术从OnSeatsListPropertyChanged方法开始。它首先得到一个不同组名称的列表。它为每个组名生成一个新的文本列,将标题自然设置为组名。

在为列设置绑定时,会出现奇怪的内容。绑定给了一个转换器,为了方便,我也决定在SeatsGrid类上实现它。转换器参数是组名。由于没有指定路径,所以当实际发生绑定时,整个Seats对象将被传递给转换器。

现在来看一下IValueConverter.Convert方法。它在与转换器参数具有相同名称的座椅中找到Group的实例(是任意的)。如果找到,则使用该Group作为查找要返回的值的键。

如果已知每个名称的组是唯一的,那么代码可以简化,但原则是相同的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6885382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档