好的,这对我来说是个蠢货。我有一个ListBox我绑定到linq查询,如下所示:
private IQueryable<Feed> _feeds;
public IQueryable<Feed> Feeds
{
get
{
if (_feeds == null)
{
var feedsQuery = from f in _db.Feed orderby f.Title select f;
_feeds = feedsQuery;
}
return _feeds;
}
}
public Options()
{
InitializeComponent();
this.DataContext = Feeds;
}
(对于记录我也尝试了List,而不是IQueryable)
一切都很好,我有一个数据绑定表单,允许您编辑记录,所有这些更改都可以正常工作,修改后的数据显示在列表中。
问题在于我添加了一个项目。列表中没有显示任何内容。数据很好地进入数据库,但查看数据的唯一方法是关闭并重新启动我的应用程序。我使用下面的代码作为例子:
Feed feed = new Feed()
{
ID = Guid.NewGuid(),
Url = "http://www.test.com",
Title = "Test"
};
_db.Feed.InsertOnSubmit(feed);
_db.SubmitChanges();
_db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues);
(有或没有_db.Refresh没有任何反应)
发生了什么事?
答案 0 :(得分:4)
你正在做的一切正确,你需要使用ObservableCollection。这将通知ListBox有关列表中的任何更改并自动刷新它。
来自MSDN
在许多情况下,您使用的数据 with是一个对象的集合。对于 例如,数据中的常见场景 绑定是使用ItemsControl 例如ListBox,ListView或 TreeView显示一个集合 记录。
P.S。你不需要数据库刷新
答案 1 :(得分:2)
除非另有通知,否则ListBox
仅在其ItemsSource
上进行一次迭代。您的查询只运行一次。
查询对象不知道数据库何时发生更改(并且Refresh
没有帮助;请参阅下文) - 由您自己知道(或预期)并在适当时重新运行相关查询倍。
Stan R提及ObservableCollection
。这很好,但只是将查询结果存储在ObservableCollection
中将无法解决问题,除非您在数据库更改时自行更新集合。这意味着重新运行查询并手动添加新项目并从集合中删除已删除的项目。 (您也可以重新运行查询并将整个结果设置回ListBox,但这意味着将创建一组全新的项目 - 性能不是很高,可能不是您想要的其他原因。)
顺便说一句,您对DataContext.Refresh
的呼叫可能没有按照您的想法行事。来自文档:
在乐观并发错误之后,此方法很有用,可以将项目置于另一次尝试的状态。它更新对象上的基本字段和属性的状态。
答案 2 :(得分:0)
好。我不是肯定的,这是100%使用ObservableCollection的正确方法,但这似乎有效:
private ObservableCollection<Feed> _feeds;
public ObservableCollection<Feed> Feeds
{
get
{
if (_feeds == null)
{
var feedsQuery = from f in _db.Feed orderby f.Title select f;
_feeds = new ObservableCollection<Feed>();
foreach (var item in feedsQuery)
{
_feeds.Add(item);
}
}
return _feeds;
}
}
添加我的项目:
Feed feed = new Feed()
{
ID = Guid.NewGuid(),
Url = "http://www.test.com",
Title = "Test"
};
_db.Feed.InsertOnSubmit(feed);
_db.SubmitChanges();
// manually update the list
Feeds.Add(feed);
我花了一点时间才弄清楚我必须手动更新列表(感谢Ben),但这一切似乎都有效。排序会很好,但我会再次担心。