#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: Рад это слышать, если теперь на ваш вопрос дан достаточный ответ, вы могли бы принять мой ответ.