C# 在WPF中过滤绑定的XML数据

C# 在WPF中过滤绑定的XML数据,c#,wpf,data-binding,C#,Wpf,Data Binding,基本上,我有一个WPF应用程序,它将在列表框中向用户显示公告。填充列表框的信息来自一个XML文件,该文件包含有关不同公告的详细信息。然后,我将应用一个数据模板来显示相关信息。我在应用程序底部有两个按钮,我想要的是当用户单击未读公告按钮时,数据被过滤,只在列表框中显示未读公告。然后,当用户单击所有公告时,我希望再次显示所有公告。无论单击哪个按钮,我使用的数据模板都将保持不变 在正在使用的XML文件中有一个名为read的字段,0表示尚未读取,1表示已读取,应使用该字段进行筛选 所以我真的只是在寻找过

基本上,我有一个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>

迈克尔
圣诞快乐
圣诞快乐
1.
G-0617-8567-EF32-hello
0
0
2009年12月31日23:59:59
加里
兰德斯克
兰德斯克分布
0
G-0618-8567-EF32-hello
0
1.
2009年12月31日23:59:59

将数据绑定到listbox或任何类似控件时,WPF会使用CollectionViewSource实例对其进行包装

假设您的数据源命名为myItems。然后您可以按如下方式获得此实例:

ICollectionViewSource viewSource = CollectionViewSource.GetDefaultView(myItems);

ICollectionViewSource有一个
过滤器
属性,可用于过滤项目。您还可以使用ICollectionViewSource.refresh()强制visual control刷新其内容。

我现在可以使用以下代码解决此问题,其中还包括将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;
        }   
    }

半知半解总是有害的,所以请粘贴一些代码以便更好地输入。现在发布的内容非常真实,很抱歉由于假期的原因造成延迟。