Фильтрация связанных XML-данных в WPF - PullRequest
0 голосов
/ 16 декабря 2009

В основном у меня есть приложение WPF, которое отображает объявления для пользователя в списке. Информация, которая заполняет список, поступает из файла XML, который содержит сведения о различных объявлениях. Затем я применяю шаблон данных для отображения соответствующих частей информации. У меня есть две кнопки внизу приложения. Я хочу, чтобы пользователь нажимал на кнопку непрочитанных объявлений, чтобы отфильтровать данные, чтобы в списке отображались только непрочитанные объявления. Затем, когда пользователь нажимает на Все объявления, я хочу, чтобы они снова отображались. Шаблон данных, который я использую, останется неизменным при нажатии любой кнопки.

В используемом XML-файле есть поле с именем read, где 0 указывает, что оно не было прочитано, а 1 указывает, что оно есть, и его следует использовать для фильтрации.

Так что на самом деле я просто ищу примеры фильтрации или любые хорошие учебники, чтобы я мог добиться определенного прогресса. Если вам понадобится какой-либо код, просто дайте мне знать, и я вставлю его.

EDIT

Теперь добавлен код ниже, чтобы показать, как связаны данные, а также расположение данных:

<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, данные хотят фильтровать, поэтому в них отображаются только сообщения с чтением == 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 ]

1 голос
/ 16 декабря 2009

Когда вы связываете свои данные со списком или любым подобным элементом управления, WPF оборачивает их экземпляром CollectionViewSource.

Допустим, ваш источник данных называется myItems. Тогда вы можете получить этот экземпляр следующим образом:

ICollectionViewSource viewSource = CollectionViewSource.GetDefaultView(myItems);

ICollectionViewSource имеет свойство Filter, которое можно использовать для фильтрации элементов. Вы также можете заставить визуальный контроль обновлять его содержимое с помощью ICollectionViewSource.Refresh ().

0 голосов
/ 05 января 2010

Теперь я смог решить эту проблему, используя следующий код, который также включал превращение узла чтения файла 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;
        }   
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...