У меня есть XML-файл со следующей структурой:
<Products>
<Product name="MyProduct1">
<Components>
<Component name="MyComponent1">
<SubComponents>
<SubComponent name="MySubComponent1"/>
<SubComponent name="MySubComponent2"/>
...more SubComponent nodes...
</SubComponents>
</Component>
...more Component nodes...
</Components>
</Product>
...more Product nodes...
</Products>
Я пытаюсь создать приложение WPF, в котором есть поле со списком продуктов. Я совершенно новичок в WPF, поэтому я не знаю, правильно ли я поступаю. Когда выбран Продукт, второй ComboBox должен быть заполнен всеми Компонентами для этого Продукта. И когда выбран Компонент, третий ComboBox должен быть заполнен всеми Подкомпонентами для этого Компонента.
Я не знаю, как установить зависимость между ComboBox, за исключением заполнения зависимого ComboBox внутри обработчика событий, запускаемого независимым ComboBox. Кажется, это означает, что мне нужно иметь возможность читать XML в C #, поэтому у меня есть [Serializable]
классов для Products
, Product
, Component
и SubComponent
. Однако я пытался сделать привязку данных XML в моем XAML:
<Window.Resources>
<XmlDataProvider Source="Products.xml"
XPath="Products/Product"
x:Key="productsXml"/>
</Window.Resources>
В настоящее время я не вижу списка названий продуктов в моем первом ComboBox, XAML которого выглядит следующим образом:
<ComboBox Height="23" HorizontalAlignment="Left" Margin="138,116,0,0"
Name="cbo_product" VerticalAlignment="Top" Width="120"
ItemsSource="{Binding Source=productsXml, XPath=@name}"
SelectionChanged="product_SelectionChanged"/>
Продукты XML должны быть доступны только для чтения - пользователь не сможет изменять какие-либо значения в XML из приложения. Я просто хочу прочитать данные XML и отобразить их в приложении.
У меня есть несколько вопросов:
- Правильно ли я поступаю? Наличие отдельного XML-файла, из которого читает мое приложение WPF, наличие
[Serializable]
классов, представляющих узлы в XML-файле с целью извлечения данных из этих узлов в C #, использование обработчика событий для кодирования зависимостей между ComboBox и т. Д.
- Почему названия моих продуктов, например, MyProduct1, не отображаются в моем ComboBox? В настоящее время он просто отображается пустым.
- Кажется, что почти * классы
[Serializable]
для представления моих узлов XML являются избыточными / ненужными, поскольку в XAML уже есть XmlDataProvider
/ XPath. Это тот случай?
Edit:
Обновил мой ComboBox XAML до следующего, и теперь я вижу свой список названий продуктов в ComboBox, благодаря ответу дециклона :
<ComboBox Height="23" HorizontalAlignment="Left" Margin="138,116,0,0"
Name="cbo_product" VerticalAlignment="Top" Width="120"
ItemsSource="{Binding Source={StaticResource productsXml}}"
DisplayMemberPath="@name"
SelectionChanged="product_SelectionChanged"/>