5

Мне нужно сделать приложение для Windows Phone для школьного проекта. Я следил за учебником, чтобы делать RSS-ридер, но он не работает, и я не знаю, почему.Windows Phone - SyndicationFeed issue

Я получаю следующее сообщение об ошибке (после того, как он работает):

System.Windows.Data Error: BindingExpression path error: 'Items' property not found on 'Expression.Blend.SampleData.JustTestingData.JustTestingData' 'Expression.Blend.SampleData.JustTestingData.JustTestingData' (HashCode=12963143). BindingExpression: Path='Items' DataItem='Expression.Blend.SampleData.JustTestingData.JustTestingData' (HashCode=12963143); target element is 'System.Windows.Controls.ListBox' (Name='FeedContent'); target property is 'ItemsSource' (type 'System.Collections.IEnumerable')..

Вот мой .cs файл:

public partial class MainPage : PhoneApplicationPage 
{ 
    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 
     this.Loaded += new RoutedEventHandler(MainPage_Loaded); 
    } 

    public void MainPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     WebClient wc = new WebClient(); 
     wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted); 
     wc.OpenWriteAsync(new Uri("http://www.twojapogoda.pl/wiadomosci.xml")); 
    } 

    public void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
    { 
     SyndicationFeed feed; 
     using (XmlReader reader = XmlReader.Create(e.Result)) 
     { 
      feed = SyndicationFeed.Load(reader); 
      FeedContent.ItemsSource = feed.Items; 

     } 
    } 
} 

Вот моя XAML:

<phone:PhoneApplicationPage 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:Syndication="clr-namespace:System.ServiceModel.Syndication;assembly=System.ServiceModel.Syndication" 
    x:Class="JustTestIt.MainPage" 
    mc:Ignorable="d" 
    SupportedOrientations="Portrait" Orientation="Portrait" 
    shell:SystemTray.IsVisible="True"> 
    <phone:PhoneApplicationPage.Resources> 
     <DataTemplate x:Key="ItemTemplate"> 
      <StackPanel> 
       <CheckBox IsChecked="{Binding date, Mode=TwoWay}"/> 
       <TextBlock Text="{Binding title}"/> 
      </StackPanel> 
     </DataTemplate> 
     <DataTemplate x:Key="ItemTemplate1"> 
      <StackPanel> 
       <CheckBox IsChecked="{Binding date, Mode=TwoWay}"/> 
       <TextBlock Text="{Binding title}"/> 
      </StackPanel> 
     </DataTemplate> 
     <DataTemplate x:Key="ItemTemplate2"> 
      <StackPanel Width="381"> 
       <TextBlock Text="{Binding title}" FontSize="32" Foreground="#FFFF8B00" Margin="0,0,10,0" FontFamily="Segoe WP Semibold"/> 
       <TextBlock Text="{Binding date}" Foreground="White" FontFamily="Segoe WP Light"/> 
      </StackPanel> 
     </DataTemplate> 
     <DataTemplate x:Key="SyndicationItemTemplate"> 
      <StackPanel> 
       <TextBlock Text="{Binding Title.Text}"/> 
      </StackPanel> 
     </DataTemplate> 
     <DataTemplate x:Key="SyndicationItemTemplate1"> 
      <StackPanel> 
       <TextBlock Text="{Binding Title.Text}"/> 
      </StackPanel> 
     </DataTemplate> 
     <DataTemplate x:Key="SyndicationItemTemplate2"> 
      <StackPanel> 
       <TextBlock Text="{Binding Title.Text}"/> 
      </StackPanel> 
     </DataTemplate> 
    </phone:PhoneApplicationPage.Resources> 

    <phone:PhoneApplicationPage.FontFamily> 
     <StaticResource ResourceKey="PhoneFontFamilyNormal"/> 
    </phone:PhoneApplicationPage.FontFamily> 
    <phone:PhoneApplicationPage.FontSize> 
     <StaticResource ResourceKey="PhoneFontSizeNormal"/> 
    </phone:PhoneApplicationPage.FontSize> 
    <phone:PhoneApplicationPage.Foreground> 
     <StaticResource ResourceKey="PhoneForegroundBrush"/> 
    </phone:PhoneApplicationPage.Foreground> 
    <Grid x:Name="LayoutRoot" Background="Transparent" DataContext="{Binding Source={StaticResource JustTestingData}}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <phone:Panorama Foreground="White" FontFamily="Segoe WP Light" Background="Black"> 
      <phone:Panorama.Title> 
       <TextBlock Text="JustTest it!"/> 
      </phone:Panorama.Title> 
      <phone:PanoramaItem x:Name="headers" CacheMode="{x:Null}" Header=""> 
       <phone:PanoramaItem.RenderTransform> 
        <TranslateTransform/> 
       </phone:PanoramaItem.RenderTransform> 
       <Grid Margin="0"> 
        <ListBox HorizontalAlignment="Left" ItemTemplate="{StaticResource ItemTemplate2}" ItemsSource="{Binding Collection}" VerticalAlignment="Top" Width="410"/> 
       </Grid> 
      </phone:PanoramaItem> 
      <phone:PanoramaItem x:Name="articles" CacheMode="{x:Null}" Header="" d:DataContext="{d:DesignData /SampleData/SyndicationFeedSampleData.xaml}"> 
       <phone:PanoramaItem.RenderTransform> 
        <TranslateTransform/> 
       </phone:PanoramaItem.RenderTransform> 
       <Grid> 
        <ListBox x:Name="FeedContent" HorizontalAlignment="Left" ItemTemplate="{StaticResource SyndicationItemTemplate2}" ItemsSource="{Binding Items}" VerticalAlignment="Top"/> 
       </Grid> 
      </phone:PanoramaItem> 
     </phone:Panorama> 
    </Grid> 
</phone:PhoneApplicationPage> 

Что я делаю неправильно, что ничего не загружается из источника? Я использую смесь и Visual Studio 2013.

+0

Как выглядят ваши данные образца? –

+0

вот он: http://pastebin.com/xQhChGja – Djent

ответ

3

Проблема с ошибкой, связанной с отсутствием свойства (в коде, который вы предоставили) explained AMR.

Кроме того, вы должны знать, что строка в коде:

FeedContent.ItemsSource = feed.Items; 

бы уничтожить Binding вы определили в XAML.

Проблема, почему ваша FeedContent не заполнена связана с линиями:

wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted); 
wc.OpenWriteAsync(new Uri("http://www.twojapogoda.pl/wiadomosci.xml")); 

Вы подписываетесь на событие OpenReadCompleted, но работает OpenWriteAsync() метод. Ваше мероприятие не будет уволено вообще (и вы, вероятно, также не сможете писать в этот Ури). Измените его на:

wc.OpenReadAsync(new Uri("http://www.twojapogoda.pl/wiadomosci.xml")); 

затем ваше мероприятие будет уволено и SyndicationFeed будет загружен.

+1

+1 для крика. Вы ученый и джентльмен. –

+2

@AMR Спасибо. Честно говоря, я боролся с собой несколько минут, чтобы опубликовать этот ответ - вы ответили на вопрос об ошибке, но мой «намек» решил проблему с заполнением. Сначала я ждал, когда вы отредактируете свой ответ после моего комментария (тогда я бы посоветовал принять его), но вы этого не сделали, поэтому я разместил свой. С наилучшими пожеланиями и приятного дня. – Romasz

+0

Огромное вам спасибо за помощь, оба из вас :) – Djent

5

Ваша ошибка в этой строке

<ListBox x:Name="FeedContent" HorizontalAlignment="Left" ItemTemplate="{StaticResource 
SyndicationItemTemplate2}" ItemsSource="{Binding Items}" VerticalAlignment="Top"/> 

Ошибка здесь

ItemsSource="{Binding Items}" 

Ее говорят, что не могу видеть свойство с именем «Элементы "

Это может быть связано с рядом причин. Мне нужно увидеть весь ваш файл CS, чтобы дать вам более конкретный ответ.

Если это все ваш файл cs, тогда возникает ОГРОМНАЯ проблема. У вас нет свойств ....

Вы можете начать добавление этого объекта.

public ObservableCollection Items {get;set;} 

Также не кажется, что вы устанавливаете файл данных.

Выше InitializeComponent сделайте это.

this.DataContext = this; 

Редактировать

на основе дальнейшей оценки вашего файла CS и некоторую творческой экстраполяции это выглядит как вам нужно сделать следующее.

Сделайте SyndicationFeed объекта недвижимости

private SyndicationFeed _feed; 
public SyndicationFeed feed {get{return _feed;} set{_feed = value; OnPropertyChanged("feed");} 

Установите DataContext в

this.Datacontext = feed; 

реализации

INotifyPropertyChanged 

добавить обработчик недвижимости событие изменения

 protected void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 

Я уверен, что вашему классу SyndicationFeed необходимо реализовать INotifyPropertyChanged.

Любой из этих двух решений должен работать.

+2

+1. OP также может просто удалить ItemsSource из xaml, поскольку он устанавливает его в коде. Существует еще одна ошибка, которая предотвратит заполнение кода кодом - 'wc.OpenWriteAsync' должен быть' wc.OpenReadAsync' - в другом случае 'wc_OpenReadCompleted' не будет запущен и список заполнен. – Romasz

+0

Теперь он работает, когда я изменил OpenWriteAsync на OpenReadAsync. Но я не могу закончить щедрость комментария. – Djent