【发布时间】:2015-04-15 21:37:32
【问题描述】:
我的 ViewModel 中有一个可观察的集合,绑定到数据网格。我想根据对集合的更改/对数据库的更新(使用 LINQ to SQL)实现一些逻辑来刷新其他窗口中的数据。
这是我的视图模型代码:
public FTViewModel(int JobID)
{
_windowCloseAction = new DelegateCommand(OnWindowClose);
_oFTrn = new ObservableFilesTransmitted(_dataDc, JobID);
_oFTrn.CollectionChanged += oFTrnCollectionChanged;
}
void oFTrnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach (FilesTransmitted f in e.NewItems)
f.PropertyChanged += FilesTransmitted_PropertyChanged;
}
if (e.OldItems != null)
{
foreach (FilesTransmitted f in e.OldItems)
f.PropertyChanged -= FilesTransmitted_PropertyChanged;
}
}
void FilesTransmitted_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "DocumentNumber")
{
_filesTransmittedChange = true;
}
_refreshViews = true;
}
和 ObservableCollection 构造函数:
class ObservableFilesTransmitted : ViewableCollection<FilesTransmitted>
{
public ObservableFilesTransmitted(DocControlDC dataDc, int ID)
{
foreach (FilesTransmitted ftran in dataDc.FilesTransmitteds.Where(x=>x.JobID==ID).OrderByDescending(x => x.TransmittalName))
{
this.Add(ftran);
}
}
}
调试器不会在 oFTrnCollectionChanged 中停止。我认为是因为创建可观察集合的调用发生在我添加 CollectionChanged 事件之前。但显然我不能切换这两条线。我已经查看了有关此的各种 StackOverflow 和 CodeProject 主题,似乎我所拥有的应该可以工作。我是否需要添加和删除一个虚拟项目才能调用 CollectionChanged 处理程序?我错过了什么?
似乎我应该有一个不添加任何成员的构造函数(用于可观察集合),以及一个从数据库添加成员的函数。然后我可以调用 new,添加 collectionchanged 处理程序,然后填充集合。我希望避免这种程度的重写,但也许这是唯一合理的方法。
【问题讨论】:
-
Observable 集合应该自动触发属性更改事件。