Группировать сетку данных с источником XmlDataProvider

#wpf #xaml #datagrid #xmldataprovider

#wpf #xaml #сетка данных #xmldataprovider

Вопрос:

У меня есть XmlDataProvider, ListBox и DataGrid. Базовый XML-файл имеет такую структуру:

 <Root>
  <Person name="test">
     <item name="bla" value="test"/>
     <item name="bla" value="test2"/>
  </Person>
<Root>
 

В списке перечислены все лица, в то время как в сетке данных перечислены все элементы, соответствующие выбранному лицу. Это работает так, как задумано.
Теперь я хочу сгруппировать данные в сетке данных, но, просмотрев примеры, я все еще не понимаю, как это сделать с помощью XmlDataProvider (как / где создать ListCollectionView из XmlDataProvider).
Не мог бы кто-нибудь, пожалуйста, дать мне быстрый пример xaml для этого, например, сгруппировав элементы по имени?:)
Заранее спасибо за любую помощь 🙂

с уважением

ОБНОВЛЕНИЕ: теперь группировка работает, но когда я добавляю что-то в xml, оно больше не отображается мгновенно (в listbox или datagrid).Что не так? Я действительно новичок в wpf, поэтому могут быть избыточные или ненужные вещи, у меня нет проблем с тем, что вы указываете на них 🙂 Вот соответствующий код, который используется:

 <Grid.DataContext>
            <XmlDataProvider x:Name="XmlData" Source="entries.xml" XPath="Root/Person" />
</Grid.DataContext>

<ListBox Name="PersonListBox"
                ItemsSource="{Binding}"
                ItemTemplate="{StaticResource listBoxTemplate}"
                IsSynchronizedWithCurrentItem="True"
                Visibility="Visible" SelectionMode="Single"  SelectedIndex="-1" DataContext="{Binding}">
            </ListBox>

<DataGrid IsSynchronizedWithCurrentItem="True" Name="itemGrid"
                      DataContext="{Binding ElementName=PersonListBox, Path=SelectedItem}" 
                      CanUserAddRows="true"
                      IsReadOnly="true"
                      AutoGenerateColumns="False">
                <DataGrid.Resources>
                    <CollectionViewSource x:Key="items" Source="{Binding XPath=item}">
                        <CollectionViewSource.GroupDescriptions>
                            <PropertyGroupDescription PropertyName="@name"/> 
                        </CollectionViewSource.GroupDescriptions>
                    </CollectionViewSource>
                </DataGrid.Resources>
                <DataGrid.ItemsSource>
                    <Binding Source="{StaticResource items}"/>
                </DataGrid.ItemsSource>
                <DataGrid.Columns>
                    <DataGridTextColumn Width="*" Header="Name" Binding="{Binding XPath=@name}"/>
                    <DataGridTextColumn Header="Wert" Binding="{Binding XPath=@value}"/>
                </DataGrid.Columns>
                <DataGrid.GroupStyle>
                    <GroupStyle />
                </DataGrid.GroupStyle>
            </DataGrid>
 

Ответ №1:

Вот пример, который должен быть достаточно понятным, но если что-то непонятно, не стесняйтесь спрашивать:

   <DataGrid>
    <DataGrid.Resources>
        <CollectionViewSource x:Key="items" Source="{Binding SelectedItem, ElementName=lb}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="@name"/>
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </DataGrid.Resources>
    <DataGrid.ItemsSource>
        <Binding Source="{StaticResource items}"/>
    </DataGrid.ItemsSource>
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding XPath=@value}"/>
    </DataGrid.Columns>
    <DataGrid.GroupStyle>
        <GroupStyle />
    </DataGrid.GroupStyle>
  </DataGrid>
 

(Вы также можете установить IsSynchronizedWithCurrentItem значение true на ListBox , а затем привязать Source через текущий элемент вместо этого (т. е. {Binding /, Source={StaticResource data}} )

Комментарии:

1. большое спасибо, работает как шарм 🙂 я действительно начинаю любить wpf ^^

2. Хорошо, это было слишком быстро, теперь изменения в xml отображаются не мгновенно, а только при перезагрузке, обновленный вопрос 🙂

3. Ладно, сри, неважно. Я изменил источник CollectionViewSource на {Привязка XPath=item}, и теперь он работает 🙂 еще раз спасибо

4. @ch40s: Рад это слышать, если теперь на ваш вопрос дан достаточный ответ, вы могли бы принять мой ответ.