Динамическое создание элементов управления WPF ComboBox

Мне нужно создать DataGrid динамически в WPF. Сетка должна быть заполнена строками и столбцами с динамически генерируемыми элементами управления (comboBox,TextBoxes). Мне нужно заполнить сетку тремя полями и 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>

В Grid мне нужно создать ComboBox в Colum1 и Column2. Комбинация column1 загрузит значения атрибута Name, доступные в XML. Основываясь на значении элемента Type первого выделения comboBox, мне нужно загрузить второй комбинированный список со значениями в узле Category. Столбец 3r в сетке должен быть заполнен либо текстовым полем, либо Datepikcer в зависимости от типа выбранного свойства. Если в XML имеется 6 узлов свойств, то максимальное число строк в сетке должно быть <=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. Я что-то упустил в приведенном выше коде? Я предполагаю, что мне может понадобиться добавить DataTemplate для ComboxBox динамически. Кто-нибудь может проверить вышеуказанный код? Также мне нужно знать, как добавить события для динамически создаваемого comboxBox в Column1 и обновить содержимое ComboxBoxes в Column2 на основе выбора в Combo1?

1 ответ

Ты сказал...

Мне нужно создать DataGrid динамически в WPF

Используете ли вы элемент управления сеткой данных WPF? В вашем примере кода его нет нигде.

Если вы использовали его, то сетка данных позволяет нам указать DataGridTextBoxColumn а также DataGridComboBoxColumn вместе с XPath привязка из XML.

Я предлагаю вам использовать это.

Другие вопросы по тегам