我希望将对象集合绑定到Silverlight中的DataGrid。这些对象属于以下类型:
public class Seats
{
Dictionary<Group, long> dctValues = new Dictionary<Group, long>();
public int Id { get; set; }
public Dictionary<Group, long> Values
{
get { return dctValues; }
}
}鉴于该集团的代表有:
public class Group
{
public int Id { get; set; }
public string Name { get; set; }
}我希望能够根据组字典生成列,其中每个列的标题设置为Group.Name,每个项的单元格值等于字典中的长值。
发布于 2011-07-30 21:17:31
我将假设我们不能保证每个组名称只有一个Group类的实例。(否则,您将根据已知组no的列表生成列?)
下面是一个从DataGrid派生的类
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作为查找要返回的值的键。
如果已知每个名称的组是唯一的,那么代码可以简化,但原则是相同的。
https://stackoverflow.com/questions/6885382
复制相似问题