Я разрабатываю своего рода Store или что-то в этом роде, где я читаю RSS-канал и отображаю его содержимое в ListBox. RSS-канал содержит дополнительные данные (например, «загрузить» или «customCategory»), которые я использую (или хочу использовать) для сортировки результатов ListBox. ListBox выглядит так:

<ListBox  Grid.Column="2" HorizontalAlignment="Stretch" Name="ItemsListParent" VerticalAlignment="Stretch" Margin="0,25,0,0">
            <ItemsControl Name="ItemsList" ItemsSource="{Binding Source={StaticResource rssData}}">
            <ItemsControl.ItemTemplate>
                <DataTemplate> 
                    <StackPanel Name="itemElement" Orientation="Horizontal" Loaded="itemElement_Loaded">
                        <StackPanel.Background>
                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                <GradientStop Color="White" Offset="0.15" />
                                <GradientStop Color="LightGray" Offset="0.85" />
                                <GradientStop Color="White" Offset="1" />
                            </LinearGradientBrush>
                        </StackPanel.Background>

                        <!--<Image Width="15" Margin="2" Source="{Binding XPath=url, Path=InnerText}"/>-->
                        <!--<TextBlock Margin="2" FontSize="16" VerticalAlignment="Center" Text="{Binding XPath=title}" FontWeight="Normal">
                            <Hyperlink Name="lnkGoToArticle" Tag="{Binding XPath=link, Path=InnerText}" Click="lnkGoToArticle_Click">
                                >>
                            </Hyperlink>
                            <Button Name="lnkDownload" Tag="{Binding XPath=download, Path=InnerText}" Style="{DynamicResource NoChromeButton}" Click="lnkDownload_Click">
                                <Image Source="Images/download31.png" Name="DownloadIcon" Width="30" Height="30" />
                            </Button>
                        </TextBlock>-->
                    </StackPanel>

                </DataTemplate>
            </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ListBox>

Код в

<!-- -->     

Это то, что я переписал на C #, поскольку думал, что смогу понять, как сортировать XML. Дело в том, что я создал

void UpdateListBox()
    {
        ItemsList.Items.Clear();

        selected = (string)CategoriesList.SelectedItem;
        //if (selected==xmldp

        /*System.Xml.XmlDocument data = new System.Xml.XmlDocument();
        data.Load(@"http://www.andystore.bluefile.cz/?feed=rss2");
        xmldp.Document = data;
        xmldp.XPath = "//item";*/


        Thickness mrg = new Thickness();
        mrg.Left = 2;
        mrg.Right = 2;
        mrg.Top = 2;
        mrg.Bottom = 2;
        TextBlock itemTitle=new TextBlock();
        itemTitle.Margin=mrg;
        itemTitle.FontSize=16;
        itemTitle.VerticalAlignment = VerticalAlignment.Center;
        itemTitle.Text = "{Binding XPath=title}";
        itemTitle.FontWeight = FontWeights.Normal;
        itemTitle.Name="itemTitle";
        Binding itemTitleBinding=new Binding();
        itemTitleBinding.XPath="title";
        itemTitle.SetBinding(TextBlock.TextProperty,itemTitleBinding);

        itemElement.Children.Add(itemTitle);
        itemElement.RegisterName(itemTitle.Name, itemTitle);

        Label gta = new Label();
        Hyperlink goToArticle = new Hyperlink();
        goToArticle.Click += new RoutedEventHandler(lnkGoToArticle_Click);
        goToArticle.Inlines.Add(@">>");
        Binding goToArticleBinding = new Binding();
        goToArticleBinding.Path = new PropertyPath("InnerText");
        goToArticleBinding.XPath = "link";
        goToArticle.SetBinding(Hyperlink.TagProperty, goToArticleBinding);
        gta.Content = goToArticle;

        itemElement.Children.Add(gta);
        itemElement.RegisterName(goToArticle.Name, goToArticle);

        Button downloadButton = new Button();
        downloadButton.Name = "lnkDownload";
        downloadButton.Cursor = Cursors.Hand;
        downloadButton.Click += new RoutedEventHandler(lnkDownload_Click);
        Binding downloadButtonBinding = new Binding();
        downloadButtonBinding.XPath = "download";
        downloadButtonBinding.Path = new PropertyPath("InnerText");
        downloadButton.SetBinding(Button.TagProperty, downloadButtonBinding);
        Style downloadButtonStyle = this.FindResource("NoChromeButton") as Style;
        downloadButton.Style = downloadButtonStyle;
        BitmapImage dbiBitmap = new BitmapImage();
        dbiBitmap.BeginInit();
        dbiBitmap.UriSource = new Uri("pack://application:,,,/AndyLaunchWPF;component/Images/download31.png");
        dbiBitmap.EndInit();
        Image dbi = new Image();
        dbi.Width = 30;
        dbi.Height = 30;
        dbi.Name = "downloadIcon";
        dbi.Source = dbiBitmap;
        downloadButton.Content = dbi;

        itemElement.Children.Add(downloadButton);
        itemElement.RegisterName(downloadButton.Name, downloadButton);

        //itemElement.Children.Add(dbi);
        //itemElement.RegisterName(dbi.Name, dbi);
    }

Но он заполняет весь список (как раньше в коде wpf) без повторения вызова !! Я хотел добавить какое-то условие для сортировки, например if (xmldp.IDontKnowTheExactName == selectedCategory) {отобразить текстовый блок } else {не отображать его и перейти к следующему элементу в XML}, но я действительно не знаю, как это сделать. Пожалуйста, проявите ко мне терпение, так как я новичок в WPF, и это тоже мой первый вопрос. В случае, если вы действительно не получили того, чего я пытаюсь достичь, вот простой список:

1) Я хочу загрузить XML и отобразить все его элементы в ItemsList

2) Я хочу выбрать элемент в ListBox с именем categoryList и на основе обновления выбора ItemsList для отображения только элементов, для которых выбран customCategory == (selected - это строка, которая будет обновляться в зависимости от выбора categoryList)

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

Надеюсь, ты понял и сможешь мне помочь.

Спасибо за любой ответ;) Энди

0
Andy 15 Фев 2014 в 11:57

1 ответ

Лучший ответ

Хорошо, забудьте о создании представления с помощью кода, это не то, как должен работать WPF. Вернитесь к исходному шаблону xaml.

Теперь проблема в том, что вы хотите отсортировать и отфильтровать элементы в ItemsControl. Для этого вам нужно привязать ItemsSource ItemsControl к CollectionView на основе rssFeed, вместо привязки к самому rssFeed.

CollectionView позволяет легко сортировать и фильтровать коллекции.

Между прочим, у вас, похоже, есть лишний ListBox в вашем XAML. Он ничего не делает, поскольку вы объявляете внутри него ItemsControl. ListBox уже происходит от ItemsControl. Если вам нужна полоса прокрутки, просто используйте ListBox.

0
GazTheDestroyer 19 Фев 2014 в 15:33
Да, можно создать с помощью кода, если вы действительно этого хотите, но это побеждает объект использования WPF, который был разработан для простого выражения в XAML и привязки к базовым данным. Он хранит презентацию отдельно от данных, поэтому вы можете применить совершенно другой графический интерфейс к одним и тем же данным, если хотите. Прочтите MVVM, который очень хорошо сохраняет этот разрыв.
 – 
GazTheDestroyer
20 Фев 2014 в 12:58
Спасибо большое, обязательно попробую! :)
 – 
Andy
20 Фев 2014 в 13:59