簡體   English   中英

在WPF中過濾綁定的XML數據

[英]Filtering bound XML data in WPF

基本上,我有一個WPF應用程序,它將在列表框中向用戶顯示公告。 填充列表框的信息來自XML文件,該文件包含有關不同公告的詳細信息。 然后,我將應用一個數據模板來顯示相關信息。 我在應用程序底部有兩個按鈕,我想要的是當用戶單擊未讀公告按鈕時,數據被篩選為僅在列表框中顯示未讀公告。 然后,當用戶單擊“所有公告”時,我希望再次顯示所有公告。 無論單擊哪個按鈕,我使用的數據模板都將保持不變。

在正在使用的XML文件中,有一個稱為read的字段,其中0表示尚未讀取,而1表示已讀取,應使用此字段進行過濾。

因此,實際上我只是在尋找過濾示例或任何不錯的教程,因此我可以取得一些進步。 如果您需要我的任何代碼,請告訴我,然后將其粘貼。

編輯

現在在下面添加了代碼,以顯示如何綁定數據以及數據的布局:

<XmlDataProvider
                        x:Key="Article"
                        Source="/Data/People.xml"
                        XPath="People/article"/>
<DataTemplate x:Key="AnnouncementTemplate">
            <Border Background="#2200FF00" 
                            BorderBrush="Black" 
                            BorderThickness="1" 
                            CornerRadius="8"  
                            Margin="2,4,2,4" 
                            Padding="2"
                    >
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="30"/>
                        <ColumnDefinition Width="220"/>
                    </Grid.ColumnDefinitions>
                    <Border Background="#2200FF00" 
                            BorderBrush="Black" 
                            BorderThickness="1" 
                            CornerRadius="8"  
                            Margin="2,4,2,4" 
                            Padding="2"
                    >
                    <StackPanel Grid.Column="0">
                        <Image Stretch="Fill" Width="20" Source="Images/BlueOrb.ico" Height="20" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                    </StackPanel>
                </Border>
                <StackPanel Grid.Column="1" Margin="5">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock FontWeight="Bold" Text="{Binding XPath=./author}" />
                        <TextBlock Text=" "/>
                        <TextBlock Text="{Binding XPath=./datetime}" TextTrimming="WordEllipsis"/>
                    </StackPanel>
                    <StackPanel>
                        <TextBlock FontWeight="Bold" Text="{Binding XPath=./title}"/>
                    </StackPanel>
                    <StackPanel>
                        <TextBlock Text="{Binding XPath=./body}" TextTrimming="WordEllipsis"/>
                    </StackPanel>
                 </StackPanel>

                </Grid>
            </Border>
        </DataTemplate>

<ListBox Style="{StaticResource SpecialListStyle}"
                         Name="listBox1"
                         Margin="10,10,10,10"
                         Grid.Row="1"
                         ItemsSource="{Binding Source={StaticResource Article}}" 
                         IsSynchronizedWithCurrentItem="True"
                         ItemContainerStyle="{StaticResource SpecialListItem}"
                         ItemTemplate="{StaticResource AnnouncementTemplate}"/>

XML文件中保存的數據示例,該數據要過濾,因此僅顯示其中read == 0的消息

<People>
  <article>
    <author>Michael</author>
    <title>Happy Christmas</title>
    <body>Merry Christmas one and all</body>
    <priority>1</priority>
    <uid>G-0617-8567-EF32-hello</uid>
    <audience>0</audience>
    <read>0</read>
    <datetime>December 31, 2009 23:59:59</datetime>
  </article>
  <article>
    <author>Gary</author>
    <title>Landesk</title>
    <body>Landesk Distributed</body>
    <priority>0</priority>
    <uid>G-0618-8567-EF32-hello</uid>
    <audience>0</audience>
    <read>1</read>
    <datetime>December 31, 2009 23:59:59</datetime>
  </article>
</People>

當您將數據綁定到列表框或任何類似控件時,WPF會將其與CollectionViewSource實例包裝在一起。

因此,假設您的數據源名為myItems。 然后,您可以按以下方式獲取此實例:

ICollectionViewSource viewSource = CollectionViewSource.GetDefaultView(myItems);

ICollectionViewSource具有一個Filter屬性,可用於過濾項目。 您還可以使用ICollectionViewSource.Refresh()強制視覺控件刷新其內容。

現在,我已經可以使用以下代碼來解決此問題,該代碼還涉及將XML文件的讀取節點變成article元素的屬性:

ICollectionView RefineList()
    {
        DataSourceProvider provider = (DataSourceProvider)this.FindResource("Article");
        return CollectionViewSource.GetDefaultView(provider.Data);
    }

        private void Unread_Click(object sender, RoutedEventArgs e)
    {
        ICollectionView view = RefineList();
         if (view.Filter == null)
        {
            view.Filter = delegate(object item)
            {
                return
                int.Parse(((XmlElement)item).Attributes["read"].Value) == 0;
            };
        }
        else
        {
            view.Filter = null;
        }   
    }

暫無
暫無

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

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