2009-12-16 58 views
0

基本上我有一个WPF应用程序,它将在列表框中向用户显示公告。填充列表框的信息来自XML文件,其中包含有关不同公告的详细信息。然后我应用数据模板来显示相关的信息。我所拥有的是应用程序底部的两个按钮,我想要的是当用户单击未读通知按钮时,数据将被过滤以仅显示列表框中的未读通知。然后,当用户点击所有公告时,我希望它们全部再次显示。我正在使用的数据模板将保持不变,无论点击哪个按钮。在WPF中筛选绑定XML数据

正在使用的XML文件中有一个名为read的字段,其中0表示它没有被读取,而1表示它具有并且应该用于过滤。

所以我真的只是寻找过滤或任何好的教程的例子,所以我可以取得一些进展。如果你需要我的任何代码,只是让我知道,我会粘贴在

编辑

现在添加下面的代码以显示数据是如何约束,也是数据的布局。

在XML文件中保持的数据的
<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}"/> 

实施例中,数据要被过滤,以便只显示消息,其中读出== 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> 
+2

一知半解总是有害的,所以请粘贴一些代码以获得更好的输入 – Firoz 2009-12-16 12:05:08

+0

现在非常真实的发布,对于延误是由于假期,感到抱歉。 – manemawanna 2010-01-04 10:54:02

回答

0

我现在已经能够解决这个使用下面的代码也参与制作的XML文件的读取节点进入文章元素的属性:

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; 
     } 
    } 
1

当你将数据绑定到列表框或任何类似的控件时,WPF用CollectionViewSource实例包装它。

假设您的数据源被命名为myItems。然后,你可以按如下得到这个实例:

ICollectionViewSource viewSource = CollectionViewSource.GetDefaultView(myItems); 

ICollectionViewSource有Filter属性,你可以用它来筛选项目。您还可以使用ICollectionViewSource.Refresh()强制使用可视化控件来刷新其内容。