动态创建WPF组合框控件

本文关键字:控件 组合 WPF 创建 动态 | 更新日期: 2023-09-27 18:10:51

我需要在WPF中动态创建一个DataGrid。网格应该用动态生成的控件(comboBox,TextBoxes)填充行和列。我需要用3列和n行填充网格(行数取决于XML文件中可用的XML节点)。我有DocumentProperties.XML在我的WPF应用程序作为内容。

    <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属性值。根据第一个组合框选择的Type元素值,我需要用Category Node中的值加载第二个组合框。网格中的3r列应该根据所选属性的类型,使用文本框或日期显示器来填充。如果XML有6个属性节点,那么Grid中的最大行数应该是<=6。以上内容将用于为高级搜索选择属性。

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

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中添加动态创建的comboxBox的事件,并根据Combo1中的选择更新Column2中comboxBox的内容?

动态创建WPF组合框控件

U said…

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

您是否使用WPF数据网格控件?您的示例代码中没有它。

如果你正在使用它,那么数据网格允许我们从xml指定DataGridTextBoxColumnDataGridComboBoxColumn以及XPath绑定。

我建议你这样做