我正在尝试编写一个rssreader,并会对一些架构提示感到高兴。 我的阅读器主窗口包含两个加载到帧中的wpf页面,它是一个“底栏”,用户可以在其中选择不同的rss提供者。在主框架(或页面)是我的列表视图。 由于加载动画和UI Freeze,我有一个额外的类,后台工作者使用RSS数据填充可观察的集合,当我调试时,它正确地填充我的集合。 在主页面中,我将datacontext设置为此可观察集合,但listview没有显示任何内容,此处我被卡住了。
这就是我所拥有的:
MainPage XAML:
> <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 Feed:
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;
}
}
感谢您的时间和提示。 最诚挚的问候
答案 0 :(得分: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。那么ListBox的Xaml将是:
<ListBox ItemsSource={Binding Path=RSSItems} ... />
如果您希望能够设置/更改RSSItems集合实例(即公共设置器),那么您应该使用NotifyPropertyChanged事件将其设置为setter,但是如果您只是添加/删除项目,那么这不是必需的。 (即加载填充构造函数中的项。)
答案 1 :(得分: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