2012-07-22 103 views
0

我試圖編寫一個rssreader,並且會對某些架構提示感到滿意。 我的閱讀器主窗口包含兩個加載到框架中的wpf頁面,這是一個「底部欄」,用戶可以選擇不同的rss提供程序。在主框架(或頁面)是我的列表視圖。 由於加載動畫和UI凍結我有一個額外的類與backgroundworker填充RSS數據的可觀察集合,當我調試時,它正確填充我的集合。 在主頁我設置datacontext這個可觀察的收藏,但列表視圖不顯示任何東西,在這裏我卡住了。Binding ObservableCollection of objects trouble

這就是我:

XAML的MainPage:

> <ListBox ItemsSource="{Binding}" DisplayMemberPath="RssTitle" 
> IsSynchronizedWithCurrentItem="True" 
> SelectionChanged="itemsList_SelectionChanged" 
> ItemContainerStyle="{DynamicResource listboxitem_style}" Height="396" 
> HorizontalAlignment="Left" Margin="126,12,0,0" Name="ListBox1" 
> VerticalAlignment="Top" Width="710"></ListBox> 

ListBox1.DataContext = GetRssItems.observable_list; 

Bottompage得到另一個RSS供稿:

GetRssItems getitems = new GetRssItems(); 
GetRssItems.observable_collection = null; 
getitems.start_bg_worker("url"); 

GetRssItems.cs

public class GetRssItems 
    { 
     public static ObservableCollection<RSSItem> observable_collection { get; set; } 
     public static string tmp_url; 
     public BackgroundWorker worker = new BackgroundWorker(); 


     public void start_bg_worker(string url) 
     { 


      if (!worker.IsBusy) 
      { 

       worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
       worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
       worker.RunWorkerAsync(url); 
      } 
     } 
} 

在BackgroundWorkers DoWork的我收到的LINQ RSS項目,並將其添加到我的觀察到的集合:

observable_collection.Add(new RSSItem(item.tmp_Title, item.tmp_Link, item.tmp_Description, item.tmp_pubDate, item.tmp_ImageUrl)); 

獨立的類RSSItem.cs

public class RSSItem 
    { 
     public string RssTitle { get; set; } 
      public string RssLink { get; set; } 
      public string RssDescription { get; set; } 
      public string RsspubDate { get; set; } 
      public string RssImageUrl { get; set; } 

      public RSSItem(string rsstitle, string rsslink, string rssdescription, string rsspubdate, string rssimageurl) 
      { 
       RssTitle = rsstitle; 
       RssLink = rsslink; 
       RssDescription = rssdescription; 
       RsspubDate = rsspubdate; 
       RssImageUrl = rssimageurl; 
      } 
    } 

感謝您的時間和提示。 問候

回答

1

使用以下命令: 數據上下文應該是對象getitems

<ListBox ItemsSource="{Binding observable_collection}" Height="167" Margin="0" Name="listBox1" Width="330" FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Top"> 
        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding RssTitle}" FontWeight="Bold" FontSize="16" /> 
           <TextBlock Text="{Binding RssLink}" FontSize="16"/> 
          </StackPanel> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox> 

PS: 您的命名是HORRBILE

+0

哦,你說得對,命名實際上是非常可怕的。試圖改變我的列表框,當你回答,但它不起作用。 Bindings屬性中的observable_collection是否已知? – nukleos 2012-07-22 16:14:10

+0

許多感謝Nahum,它現在正在工作:) – nukleos 2012-07-22 22:07:33

+0

@nukleos即使是一次性使用5行代碼,也永遠不會寫出錯誤命名的代碼。 再次閱讀有關MVVM模式後,我建議您結帳 MVVMLight或Prism框架。將爲您節省大量麻煩。 – Nahum 2012-07-23 06:12:33

2

您需要閱讀了一下MVVM得到最受益於WPF。你的行設置列表框的datacontext相當混亂。

你應該有什麼是你的主窗口的(xaml)數據上下文設置爲包含您的可觀察集合的視圖模型類。列表框的ItemsSource被設置爲該屬性名稱。

例如:

public class MainViewModel : INotifyPropertyChanged 
{ 
    public ObservableCollection<RSSItem> RSSItems 
    { 
     get; 
     set; 
    } 
    // Other stuff applicable to the main window. 
} 

當視圖被構造,通過MainViewModel的實例,以它的DataContext的。然後,XAML中的列表框將是:

<ListBox ItemsSource={Binding Path=RSSItems} ... /> 

如果你想能夠設置/更改的RSSItems收集實例(即公共setter方法),那麼你應該用NotifyPropertyChanged事件設置它,它的制定者,但如果你只需添加/刪除項目,那麼這不應該是必要的。 (也就是加載填充構造函數中的項目)。

+0

感謝您的提示,目前閱讀了一些關於MVVM的文章。 – nukleos 2012-07-22 22:09:35

相關問題