2009-12-16 60 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()強制使用可視化控件來刷新其內容。