gpt4 book ai didi

c# - 绑定(bind) ObservableCollection 对象麻烦

转载 作者:行者123 更新时间:2023-12-03 11:00:15 25 4
gpt4 key购买 nike

我正在尝试编写一个 rssreader 并且会为一些架构提示感到高兴。
我的阅读器主窗口包含两个加载到框架中的 wpf 页面,它是一个“底部栏”,用户可以在其中选择不同的 rss 提供程序。在主框架(或页面)中是我的 ListView 。
由于加载动画和 UI 卡住,我有一个额外的类,它带有一个后台工作程序,它用 RSS 数据填充一个可观察的集合,当我调试时,它正确地填充了我的集合。
在主页中,我将 datacontext 设置为这个可观察的集合,但 listview 没有显示任何内容,我在这里卡住了。

这就是我所拥有的:

主页 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;

获取另一个 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;
}
}

感谢您的时间和提示。
最好的祝福

最佳答案

您需要阅读一点 MVVM 才能从 WPF 中获得最大 yield 。您设置列表框数据上下文的行相当困惑。

您应该拥有的主窗口 (xaml) 数据上下文设置为包含您的可观察集合的 View 模型类。列表框的 ItemsSource 设置为该属性名称。

例如:

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

构造 View 时,将 MainViewModel 的一个实例传递给它的 DataContext。那么 ListBox 的 Xaml 将是:
<ListBox ItemsSource={Binding Path=RSSItems} ... />

如果您希望能够设置/更改 RSSItems 集合实例(即公共(public) setter ),那么您应该使用 NotifyPropertyChanged 事件将其设置为 setter ,但是如果您只是添加/删除项目,那么这应该是没有必要的。 (即加载填充构造函数中的项目。)

关于c# - 绑定(bind) ObservableCollection 对象麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11600000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com