Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Построение многоуровневого меню из XML-источника


Автор: Leviafan 30.6.2009, 22:25
Нужен пример неплоского связывания элемента управления Menu с XML-файлом, описывающем всю структуру меню.

Автор: Partizan 1.7.2009, 09:24
Leviafan, что вы понимаете под "неплоским" связыванием?

Автор: Leviafan 1.7.2009, 15:59
   XMLFile1.xml
Код

<Root>
   <Node title="File">
      <Node title="Save">
         <Node title="Save as text"/>
         <Node title="Save as project"/>
      </Node>
      <Node title="Quit"/>
   </Node>
   <Node name="About"/>
</Root>
   Вот это - "плоское" (одноуровневое) связывание:
Код

<Window.Resources>
   <XmlDataProvider x:Key="DS1" d:IsDataSource="True" Source=".../XMLFile1.xml"/>
</Window.Resources>
<Menu VerticalAlignment="Top" Height="Auto" ItemsSource="{Binding Source={StaticResource DS1}, XPath=/Root/Node/@title}"/>

Автор: Partizan 1.7.2009, 18:58
Leviafan, ну а "неплоское" что из себя представляет?

Автор: Leviafan 2.7.2009, 11:04
А "неплоское" - многоуровневое (рекурсивное), т.е. при связывании с иерархическим источником данных объект впитывает всю иерархическую структуру, а не указанный верхний уровень среза (выборки).

Автор: Partizan 2.7.2009, 12:42
Leviafan, такая задача решается посредством использования HierarchicalDataTemplate. 

Тут есть пример для TreeViewItem: http://forum.vingrad.ru/forum/topic-258482/hl/hierarchicaldatatemplate/index.html

C MenuItem всё аналогично

Автор: Leviafan 2.7.2009, 16:53
Partizan, суть идеи ясна, однако хотелось бы увидеть полный пример..

Автор: Partizan 2.7.2009, 18:06
Leviafan, вот, накидал:

Код

<Root>
   <Node title="File">
      <Node title="Save">
         <Node title="Save as text"/>
         <Node title="Save as project"/>
      </Node>
      <Node title="Quit"/>
   </Node>
   <Node title="About"/>
</Root>


Код

 <Window.Resources>
            <XmlDataProvider x:Key="DS1" Source="pack://application:,,,/xxx.xml" XPath="/Root/Node"/> <!-- source поменять на необходимый -->
    </Window.Resources>


Код

...
<Grid>
 <Grid.Resources>
            <HierarchicalDataTemplate x:Key="template" ItemsSource="{Binding XPath=Node}">
                        <AccessText Text="{Binding XPath=@title}"/>
            </HierarchicalDataTemplate>
        </Grid.Resources>
        <Menu  VerticalAlignment="Top" Height="Auto" ItemsSource="{Binding Source={StaticResource DS1}}" ItemTemplate="{StaticResource template}"/>
</Grid>
...

Автор: Leviafan 2.7.2009, 20:47
О, сенкс!!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)