【问题标题】:Creating WPF ComboBox Controls Dynamically动态创建 WPF ComboBox 控件
【发布时间】:2011-10-11 11:54:29
【问题描述】:

我需要在 WPF 中动态创建一个 DataGrid。网格应使用动态生成的控件(组合框、文本框)填充行和列。我需要用三列和 N 行填充网格(行数基于 XML 文件中可用的 XML 节点)。我的 WPF 应用程序中有 DocumentProperties.XML 作为内容。

    <DocumentProperties>
<Properties>
  <Property Name="DocumentName">
      <Id>1</Id>
      <Name>DocumentName</Name>
      <Type>LogicalOperator</Type>
      <Language>en-US</Language>
  </Property> 
   <Property Name="TemplateUsed">
      <Id>2</Id>
      <Name>TemplateUsed</Name>
      <Type>LogicalOperator</Type>
      <Language>en-US</Language>
  </Property> 
  ....
 </Properties>
<Operators>
<Category Type="LogicalOperator">
    <Operator value="Equal"></Operator>
    <Operator value="NotEqual"></Operator>
</Category>
<Category Type="TimeOperator">
    <Operator value="Greater"></Operator>
    <Operator value="Smaller"></Operator>
    <Operator value="GreaterOrEqual"></Operator>
    <Operator value="SmallerOrEqual"></Operator>
</Category>
</DocumentProperties>

在网格中,我需要在 Colum1 和 Column2 中创建一个 ComboBox。 column1 组合将加载 XML 中可用的 Name 属性值。根据第一个组合框选择的类型元素值,我需要使用类别节点中的值加载第二个组合框。网格中的第 3 列应根据所选属性的类型填充文本框或 Datepikcer。如果 XML 有 6 个属性节点,那么 Grid 中的最大行数应该是

我已经开始从后面的代码创建网格。我试过的部分代码如下:

documentPropertyCombo = new ComboBox[drivesCount];
                operatorCombo = new ComboBox[drivesCount];
                //Load the XML Document
                XmlDataProvider xdp = new XmlDataProvider();
                XmlDocument doc = new XmlDocument();
                doc.Load(".\\Data\\DocumentProperties.xml");
                xdp.Document = doc;
                xdp.XPath = "DocumentProperties/Properties/Property";
                xdp.Document = doc;

                drivesGrid.DataContext = xdp;
                var binding = new Binding("DocumentProperties/Properties/Property") { Source = xdp };
                binding.Mode = BindingMode.OneTime;

// Adding ComboBoxes and TextBoxes to Grid.
                for (int i = 0, j = 1; i < drivesCount; i++, j++)
                {
                    //Initialize ComboBox to show Document Property.
                    //documentPropertyCombo[i] = new ComboBox();
                    documentPropertyCombo[i] = new ComboBox(); //CreateComboBox(new Thickness(30, 101, 0, 0), i + j, 1);
                    documentPropertyCombo[i].Width = 101;
                    documentPropertyCombo[i].Height  = 30;
                    documentPropertyCombo[i].Visibility = Visibility.Visible;
                    //BindingOperations.SetBinding(myText, TextBlock.TextProperty, myBinding);
                    documentPropertyCombo[i].IsReadOnly = true;
                    documentPropertyCombo[i].DisplayMemberPath = "@Name";
                    BindingOperations.SetBinding(documentPropertyCombo[i], ComboBox.TextProperty, binding);

                    Grid.SetRow(documentPropertyCombo[i], i + j);
                    Grid.SetColumn(documentPropertyCombo[i], 1);
                    drivesGrid.Children.Add(documentPropertyCombo[i]);

 ...
}
LayoutRoot.Children.Add(drivesGrid);

控件是动态创建的,但数据未绑定到 ComboBox。我在上面的代码中遗漏了什么吗?我假设我可能需要为 ComboxBox 动态添加一个 DataTemplate。有人可以验证上面的代码吗?我还需要知道如何在 Column1 中为动态创建的组合框添加事件,并根据 Combo1 中的选择更新 Column2 中的组合框的内容?

【问题讨论】:

    标签: c# wpf xml combobox xmldataprovider


    【解决方案1】:

    你说……

    我需要在 WPF 中动态创建一个 DataGrid

    您使用的是 WPF 数据网格控件吗?您的示例代码在任何地方都没有。

    如果您使用它,那么数据网格允许我们指定 DataGridTextBoxColumnDataGridComboBoxColumn 以及来自 XML 的 XPath 绑定。

    我建议你使用它。

    【讨论】:

    • 您能否提供 WPF DataGrid 的完整命名空间?它是 WPFToolKit 的一部分/默认情况下是否可用?几行示例代码将有助于重新完成我的任务。也欢迎任何指向教程的链接。
    • .Net 4.0 自带的内置 DataGrid 用于 WPF,但如果您使用的是较早版本的 .Net 框架,则需要自己获取。
    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    相关资源
    最近更新 更多