我有一个列表,其中包含表示我想在数据网格中显示的行和列的字符串列表。每行中的字符串数不必是常量,所以说列表看起来像这样:
我想让它产生4个柱子,其中2个较短的行留下最后的柱子为空。我试图将DataContext设置为列表对象,但这似乎不太可能......
任何人都知道如何做到这一点?
答案 0 :(得分:1)
我认为使用DataGrid你无法做到。或者这将是非常困难的,而不是微不足道的。您可以使用嵌套的ItemsControls代替DataGrid。这样的事情:
<ItemsControl ItemsSource = {Binding MyList}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource = {Binding}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text = {Binding}/>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我希望它会对你有所帮助。
答案 1 :(得分:1)
我建议您创建一个包含4个字段的类,如
public class Data{
public string Field1{get;set;}
public string Field2{get;set;}
public string Field3{get;set;}
public string Field4{get;set;}
}
示例就像这样
var ls = new List<Data>();
// Fill your data in `List<List<string>>` to ls
dataGrid.AutoGenerateColumns = false;
dataGrid.ItemSource = ls;
修改强>
我看过DataGrid,似乎不支持这种绑定。
我在Dynamically Add C# Properties at Runtime
的帮助下想出了其他解决方案我想看看是否还有其他更好的方式。
var list = new List<List<string>>
{
new List<string> {"Test", "Test", "Test"},
new List<string> {"Test", "Test", ""},
new List<string> {"Test", "Test", "Test", "Test"}
};
var maxLength = list.Max(c => c.Max(r => r.Length));
for (int i = 0; i < maxLength; i++)
{
ResulDataGrid.Columns.Add(new DataGridTextColumn() { Header = "Field" + i, Binding = new Binding("Row" + i) });
}
foreach (var listItem in list)
{
var properties = new Dictionary<string, object>();
for (int i = 0; i < listItem.Count; i++)
{
properties.Add("Row" + i, listItem[i]);
}
var myObject = GetDynamicObject(properties);
ResulDataGrid.Items.Add(myObject);
}
public static dynamic GetDynamicObject(Dictionary<string, object> properties)
{
var dynamicObject = new ExpandoObject() as IDictionary<string, Object>;
foreach (var property in properties)
{
dynamicObject.Add(property.Key, property.Value);
}
return dynamicObject;
}