2009-12-16 5 views
0

Fondamentalement, j'ai une application WPF qui va afficher des annonces à l'utilisateur dans une liste. Les informations qui remplissent la zone de liste proviennent d'un fichier XML contenant des informations sur les différentes annonces. J'applique ensuite un modèle de données pour afficher les informations pertinentes. Ce que j'ai est deux boutons en bas de l'application, ce que je veux est quand l'utilisateur clique sur le bouton des annonces non lues que les données sont filtrées pour montrer seulement les annonces non lues dans la liste. Ensuite, lorsque l'utilisateur clique sur Toutes les annonces, je veux qu'elles soient affichées à nouveau. Le modèle de données que j'utilise restera le même quel que soit le bouton cliqué.Filtrage des données XML liées dans WPF

Dans le fichier XML qui est utilisé, il y a un champ appelé read, avec 0 indiquant qu'il n'a pas été lu alors que 1 indique qu'il a et doit être utilisé pour filtrer. Donc vraiment je cherche juste des exemples de filtrage ou de bons tutoriels, donc je peux faire quelques progrès. Si vous avez besoin de mon code juste laissez-moi savoir et je vais le coller dans

EDIT

par code ajouté ci-dessous pour montrer comment les données sont liés et aussi la mise en page des données.

<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}"/> 

Exemple des données contenues dans le fichier XML, les données veut filtrer il montre que les messages où lecture == 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

connaissances La moitié est toujours nuisible, donc s'il vous plaît Collez du code pour de meilleures entrées. – Firoz

+0

Très vrai maintenant affiché, désolé pour le retard était dû à la saison des vacances. – manemawanna

Répondre

0

J'ai été en mesure de résoudre ce en utilisant le code suivant qui a également impliqué faire le noeud de lecture du fichier XML dans un attribut de l'élément de l'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; 
     } 
    } 
1

Lorsque vous liez vos données à une zone de liste ou à un contrôle similaire, WPF l'enveloppe avec l'instance CollectionViewSource. Donc, disons que votre source de données s'appelle myItems. Ensuite, vous pouvez obtenir cette instance comme suit:

ICollectionViewSource viewSource = CollectionViewSource.GetDefaultView(myItems); 

ICollectionViewSource a une propriété Filter que vous pouvez utiliser pour filtrer les éléments. Vous pouvez également forcer le contrôle visuel à actualiser son contenu à l'aide de ICollectionViewSource.Refresh().

Questions connexes