列表<列表<字符串>&GT;到datagrid wpf </list <string>

时间:2014-06-11 06:48:22

标签: c# wpf datagrid

我有一个列表,其中包含表示我想在数据网格中显示的行和列的字符串列表。每行中的字符串数不必是常量,所以说列表看起来像这样:

  1. 测试,测试,测试
  2. 测试,测试,
  3. 测试,测试,测试,测试
  4. 我想让它产生4个柱子,其中2个较短的行留下最后的柱子为空。我试图将DataContext设置为列表对象,但这似乎不太可能......

    任何人都知道如何做到这一点?

2 个答案:

答案 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;
        }