将xml文件分组到datagrid中

将xml文件分组到datagrid中,xml,wpf,datagrid,Xml,Wpf,Datagrid,我想将我的xml绑定数据网格分组 这是我从互联网上得到的代码,我一直在工作! 但我需要在这里绑定XML文件,而不是将DataContext绑定到列表(addressList)。。。 我该怎么做 addressList = new ObservableCollection<Address>(){ <== this is an example ! But I've got a XML file ?! Howto ? new Address

我想将我的xml绑定数据网格分组

这是我从互联网上得到的代码,我一直在工作! 但我需要在这里绑定XML文件,而不是将DataContext绑定到列表(addressList)。。。 我该怎么做

        addressList = new ObservableCollection<Address>(){   <== this is an example ! But I've got a XML file ?! Howto ?
            new Address{ Country="Argentina", City="Buenos Aires", Street="Ldiary"},
            new Address{ Country="Argentina", City="Buenos Aires", Street="Translations"},
            new Address{ Country="Austria", City="Graz", Street="Ldiary Translations"},
            new Address{ Country="Austria", City="Salzburg", Street="Ldiary"},
            new Address{ Country="Belgium", City="Bruxelles", Street="Translations"},
            new Address{ Country="Belgium", City="Charleroi", Street="Ldiary Translations"},
            new Address{ Country="Brazil", City="Campinas", Street="Japanese"},
            new Address{ Country="Brazil", City="Resende", Street="English"},
            new Address{ Country="Brazil", City="Rio de Janeiro", Street="Ldiary Translations"},
            new Address{ Country="Canada", City="Montreal", Street="Ldiary Translations"},
            new Address{ Country="Canada", City="Montreal", Street="Ldiary Translations"},
            new Address{ Country="Denmark", City="Arhus", Street="English to Japanese"},
            new Address{ Country="Denmark", City="Kobenhavn", Street="Ldiary Translations"},
            new Address{ Country="Finland", City="Helsinki", Street="Ldiary Translations"},
            new Address{ Country="Finland", City="Oulu", Street="Ldiary Translations"},
            new Address{ Country="France", City="Lille", Street="Ldiary Translations"},
            new Address{ Country="France", City="Lyon", Street="Ldiary Translations"},
            new Address{ Country="France", City="Marseille", Street="Ldiary Translations"},
            new Address{ Country="France", City="Nantes", Street="English"},
            new Address{ Country="Germany", City="Aachen", Street="Japanese"},
            new Address{ Country="Germany", City="Berlin", Street="Ldiary Translations"}
        };

this.DataContext = addressList; <= Not 
CollectionView cv = CollectionViewSource.GetDefaultView(dataGrid.DataContext) as  CollectionView;
        cv.GroupDescriptions.Add(new PropertyGroupDescription("Country"));
我的xml文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<response>
    <conv>
        <sms><recipient>test</recipient><datetime/><message/></sms>
        <sms>
            <msgid>123456</msgid>
            <datetime>15-12-2012 21:36:55</datetime>
            <message>test</message>
        </sms>
    </conv>
</response>

测试
123456
15-12-2012 21:36:55
测试

您可以直接在Xaml中绑定XML数据

例如:

从窗口或控件资源中的文件创建xml源

 <Window.Resources>
     <XmlDataProvider x:Key="AddressXML" XPath="/Address" Source="C:\AddressData.xml" />
 </Window.Resources>

然后可以将文档中的元素/节点绑定到DataGrid或其他控件

  <Grid>
      <DataGrid DataContext="{StaticResource AddressXML}" ItemsSource="{Binding XPath=Address}" />
  </Grid>

如果你发布一个xml文件的例子,我可以给你一个更好的解释

xaml中的CollectionViewSource

   xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
   xmlns:dat="clr-namespace:System.Windows.Data;assembly=PresentationFramework"


<Window.Resources>
    <XmlDataProvider x:Key="SmsData" XPath="/response" Source="C:\data.xml"/>

    <CollectionViewSource x:Key="SmsView"  Source="{StaticResource SmsData}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="datetime" />
        </CollectionViewSource.SortDescriptions>
        <CollectionViewSource.GroupDescriptions>
            <dat:PropertyGroupDescription PropertyName="msgid" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>

</Window.Resources>

<Grid>
    <DataGrid DataContext="{StaticResource SmsView}"  ItemsSource="{Binding XPath=conv/sms}" AutoGenerateColumns="False" >
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding XPath=msgid}" Width="100"  />
            <DataGridTextColumn Binding="{Binding XPath=imsgid}" Width="100"  />
            <DataGridTextColumn Binding="{Binding XPath=recipient}" Width="100"  />
            <DataGridTextColumn Binding="{Binding XPath=datetime}" Width="120" />
            <DataGridTextColumn Binding="{Binding XPath=message}" Width="225" />
        </DataGrid.Columns>

    </DataGrid>
</Grid>
xmlns:scm=“clr命名空间:System.ComponentModel;assembly=WindowsBase”
xmlns:dat=“clr命名空间:System.Windows.Data;assembly=PresentationFramework”

是否尝试过使用XDocument或XmlDocument解析XML文件,然后通过元素循环到可观察集合中?您不需要绑定XML文件,您需要绑定XML文件中的数据。。那么您想从代码隐藏中将ObservableCollection绑定到DataGrid?或者只是对数据进行分组?只是基于xml绑定文件对我的DataGrid中的数据进行分组。。。但我发现实现这一点的唯一方法是使用ObservableCollection(就像我的beginpost中的第一个代码),您想在xaml中完成这一切吗?address=smsdata吗?是的,就像我文章中的第一个代码(也包括xaml)。地址=smsdata?否与彼此无关。好吧,如果我理解正确,您只需要xaml中的collectionviewsource,而“地址”数据不在任何地方使用?
  <Grid>
      <DataGrid DataContext="{StaticResource AddressXML}" ItemsSource="{Binding XPath=Address}" />
  </Grid>
   xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
   xmlns:dat="clr-namespace:System.Windows.Data;assembly=PresentationFramework"


<Window.Resources>
    <XmlDataProvider x:Key="SmsData" XPath="/response" Source="C:\data.xml"/>

    <CollectionViewSource x:Key="SmsView"  Source="{StaticResource SmsData}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="datetime" />
        </CollectionViewSource.SortDescriptions>
        <CollectionViewSource.GroupDescriptions>
            <dat:PropertyGroupDescription PropertyName="msgid" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>

</Window.Resources>

<Grid>
    <DataGrid DataContext="{StaticResource SmsView}"  ItemsSource="{Binding XPath=conv/sms}" AutoGenerateColumns="False" >
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding XPath=msgid}" Width="100"  />
            <DataGridTextColumn Binding="{Binding XPath=imsgid}" Width="100"  />
            <DataGridTextColumn Binding="{Binding XPath=recipient}" Width="100"  />
            <DataGridTextColumn Binding="{Binding XPath=datetime}" Width="120" />
            <DataGridTextColumn Binding="{Binding XPath=message}" Width="225" />
        </DataGrid.Columns>

    </DataGrid>
</Grid>