【问题标题】:How to programmatically form an observable collection and bind it to a datagrid如何以编程方式形成可观察集合并将其绑定到数据网格
【发布时间】:2016-05-22 05:48:38
【问题描述】:

我有一个问题,我将分为两个步骤:

问题1.

形成一个可观察的字符串集合并将其绑定到数据网格

ObservableCollection<string[]> octest = new ObservableCollection<string[]>();
var el = new string[6] {"1","2","3", "4", "5", "6" };
octest.Add(el);
octest.Add(el);
octest.Add(el);
dtgResults.ItemsSource = octest;

问题是绑定结果如下图:


问题 2

相同,但现在有一个字符串数组,但有混合元素(例如 3 个字符串和 3 个双精度数)

谢谢

--编辑-- 用于 CBreeze

我已经做到了:

  ObservableCollection<TestModel> t = new ObservableCollection<TestModel>();
  var t1 = new TestModel();
  t.Add(t1);
  t.Add(t1);
  t.Add(t1);
  dtgResults.ItemsSource = t;
 }
}

public class TestModel
{
  public TestModel()
  {
    TestDouble1 = new string[3];
    TestDouble1[0] = "A";
    TestDouble1[1] = "B";
    TestDouble1[2] = "C";
  }
  public string[] TestDouble1 { get; set; }
}

结果是:

【问题讨论】:

  • 您应该发布您的数据网格列定义以查看问题所在
  • 您的预期结果是什么?
  • @Pikoh 数据网格没有列:您认为这是问题所在吗?
  • @VadimMartynov 我想看看 | 1 | 2 | 3 | 4 | 5 | 6 |然后能够自定义每列的标题

标签: c# wpf data-binding datagrid observablecollection


【解决方案1】:

来自

programmatically add column & rows to WPF Datagrid

你可以这样做:

string[] columnLabels = new string[] { "Column 0", "Column 1", "Column 2", "Column 3", "Column 4", "Column 5" };

foreach (string label in columnLabels)
{
 DataGridTextColumn column = new DataGridTextColumn();
 column.Header = label;
 column.Binding = new Binding(label.Replace(' ', '_'));

 dtgResults.Columns.Add(column);
}

int[] ivalues = new int[] { 0, 1, 2, 3 };
string[] svalues = new string[] { "A", "B", "C", "D" };

dynamic row = new ExpandoObject();

for (int i = 0; i < 6; i++)
{

 switch (i)
 {
  case 0:
  case 1:
  case 2:
   string str = columnLabels[i].Replace(' ', '_');
   ((IDictionary<String, Object>)row)[str] = ivalues[i];
   break;

   case 3:
   case 4:
   case 5:
    string str2 = columnLabels[i].Replace(' ', '_');
    ((IDictionary<String, Object>)row)[str2] = svalues[i - 3];
    break;

 }
}

dtgResults.Items.Add(row);

【讨论】:

    【解决方案2】:

    将您的ObservableCollection 绑定到Model

    ObservableCollection&lt;TestModel&gt; octest = new ObservableCollection&lt;TestModel&gt;();

    创建您的TestModel

    public class TestModel
    {
        public double TestDouble1 { get; set; }
        public double TestDouble2 { get; set; }
        public double TestDouble3 { get; set; }
        public string TestString1 { get; set; }
        public string TestString2 { get; set; }
        public string TestString3 { get; set; }
    }
    

    然后您需要实际创建一个TestModel....

    TestModel newTestModel = new TestModel();

    将新值添加到TestModel.....

    newTestModel.TestString1 = "Hello"
    newTestModel.TestString2 = "Hello"
    newTestModel.TestString3 = "Hello"
    

    最后将新的TestModel添加到ObservableCollection

    octest.Add(newTestModel);

    【讨论】:

    • 我不能,因为我不知道元素的数量。所以我不知道有多少 TestDouble 或 TestString ,因为它是在运行时决定的。
    • Model 中添加一个Array,而不是使用StringDouble,最好添加一个Dictionary,它需要StringDouble,例如: var myDict = new Dictionary&lt;string, List&lt;double&gt;&gt;();
    猜你喜欢
    • 2023-02-14
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多