【问题标题】:Add items into DataContext via loop通过循环将项目添加到 DataContext
【发布时间】:2012-07-16 08:49:18
【问题描述】:

我在 C#,WPF 中有以下代码:

base.DataContext = new DataTemplate[]
                {
                    new DataTemplate
                    {
                        lblText = "First",
                        txtBoxContent = ""
                    },

                    new DataTemplate
                    {
                        lblText = "Second",
                        txtBoxContent = "Something"
                    }
                };

但我需要从数据库中动态填充 DataContext。我的想法是这样的:

base.DataContext = new DataTemplate[]
        {
            for(int i = 0; i< dsTmp.Tables[0].Rows.Count; i++)
            {
                new DataTemplate
                {
                    lblText = "Count: ",
                    txtBoxContent = dsTmp.Tables[0].Rows[i][0].ToString();
                }
            }
        };

当我输入这个时,它对我大喊一些语法错误;

谁能告诉我,如何正确写?

【问题讨论】:

  • 如果你也写下错误会很有帮助。
  • ;预期的 //// 无效的表达式术语 'for'
  • 我认为,问题在于语法错误。在我看来 for 循环不能在新的 DataTemplate[]{} 中。但是我不知道怎么写。

标签: c# wpf loops datatemplate datacontext


【解决方案1】:

object initializer 语法中不能有代码。为什么不简单地这样做:

   var list = new DataTemplate[dsTmp.Tables[0].Rows.Count];
   for(int i = 0; i< dsTmp.Tables[0].Rows.Count; i++)
    {
        var item = new DataTemplate
        {
            lblText = "Count: ",
            txtBoxContent = dsTmp.Tables[0].Rows[i][0].ToString();
        };
        list[i] = item;
    }

    this.DataContext = list;

【讨论】:

  • 或者你可以使用 Linq,this.DataContext=dsTmp.Tables[0].Rows.Select(x=&gt;new DataTemplate { lblText = "Count: ", txtBoxContent=x[0].ToString() }).ToArray();
  • @BobVale 很好,我喜欢 :),如果你愿意,我会添加它的答案 :-)... 或者只是你的 :)
  • 在新数据模板的结束括号后仍然写错误“;预期”。
  • @BeerMaker 抱歉错过了;创建新的DataTemplate后,我会更新它。
  • @MBen,添加为喜欢的答案:)
【解决方案2】:

MBen 和 Habib 已经回答了 for 失败的原因,因为您不能在对象初始化程序中执行循环,并且提供了循环替代方案。

您也可以使用 linq 来执行初始化。

this.DataContext=dsTmp.Tables[0].Rows.Select(
  x=>new DataTemplate { 
                        lblText = "Count: ",
                        txtBoxContent=x[0].ToString()
                      }).ToArray(); 

【讨论】:

  • 如果您错过了 .ToArray(),那么 datacontext 将是一个 IEnumerable,在 DataContext 出现之前不会对其进行评估。
  • 您甚至可以在.Select 之前插入.AsParallel() 以使用多个线程来生成数组。
【解决方案3】:

; 丢失的错误有点误导。实际问题是您正在尝试使用循环创建 DataTemplate 数组,您不能在数组/对象初始化中使用循环。试试下面的。

DataTemplate[] tempDataTemplate = new DataTemplate[ds.Temp.Tables[0].Rows.Count]();
for(int i = 0; i< dsTmp.Tables[0].Rows.Count; i++)
            {

             tempDataTemplate[i] =   new DataTemplate
                                             {
                                             lblText = "Count: ",
                                             txtBoxContent = dsTmp.Tables[0].Rows[i][0].ToString();
                                             };
            }

base.DataContext = tempDataTemplate;

【讨论】:

    【解决方案4】:

    我不知道你想要实现什么,但你有没有尝试过使用视图模型优先方法的 mvvm?

    创建一个视图模型类,例如MyData 具有 2 个公共属性 MyText、MyContent。创建这些对象的集合并从您的数据库中填充它。

    至少您需要一个将 itemssource 绑定设置为您的集合的 itemscontrol 和一个用于 MyData 对象的数据模板。

    <DataTemplate DataType="{x:Type local:MyData}">
      <view:MyDataViewControl />
    </DataTemplate>
    

    现在您可以在 itemscontrol 中看到所有动态对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多