簡體   English   中英

將xml文件分組為datagrid

[英]group xml file into datagrid

我想對我的xml綁定的數據網格進行分組...

我從互聯網上獲得的這段代碼可以正常工作! 但是,除了將DataContext綁定到列表(addressList)之外,我還需要在這里綁定我的XML文件。

        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"));

我的XAML:

 <Window.Resources>
    <XmlDataProvider x:Key="SmsData" XPath="/response"> => source added by code

    </XmlDataProvider>

    <local:RowColorConverter x:Key="RowColorConverter" />
</Window.Resources>
<Grid>

    <DataGrid ItemsSource="{Binding Source={StaticResource SmsData}, XPath=conv/sms}" AutoGenerateColumns="False" Name="dataGrid1" GridLinesVisibility="None" IsReadOnly="True" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" Margin="-5,13,4,244" BorderThickness="0" UseLayoutRounding="False" IsEnabled="True" SelectionChanged="dataGrid1_SelectionChanged">

        <DataGrid.GroupStyle>
            <GroupStyle AlternationCount="6" >
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <ItemsPresenter />
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </DataGrid.GroupStyle>
        <DataGrid.RowStyle>
            <Style>
                <Setter Property="DataGridRow.Background" 
                        Value="{Binding RelativeSource={RelativeSource AncestorType=GroupItem}, 
                    Path=(ItemsControl.AlternationIndex), Converter={StaticResource RowColorConverter}}"/>
            </Style>
        </DataGrid.RowStyle>
        <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>

在cs中(字段msgid是要分組的元素):

XmlDataProvider dataProvider = this.FindResource("SmsData") as XmlDataProvider;
            dataProvider.Source = new Uri(someurl);

DataContext = this;
        CollectionView cv = CollectionViewSource.GetDefaultView(dataGrid1.DataContext) as CollectionView;
        cv.GroupDescriptions.Add(new PropertyGroupDescription("msgid"));

我的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>

您可以直接在Xaml中綁定XML數據。

例:

從您的Window或Control資源中的文件創建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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM