我是WPF和MVVM的新手,我从"Jason Dolinger on Model-View-ViewModel"文章和示例开始,但是我对数据绑定(bind)有一些疑问。
1)在他的演示应用程序中,他将ObservableCollection项目的DependencyObject子类化。与INotifyPropertyChanged相比有什么优缺点?
2)从数据网格/列表 View 中的模型更新 View 的最佳方法是什么?在他的示例中,添加或更新Quote对象时,他注册为监听器:
_source.QuoteArrived += new Action<Quote>(_source_QuoteArrived);
比ViewModel创建并添加QuoteViewModel对象并将其添加到集合中,或者通过使用称为_quoteMap的字典在便捷的QuoteViewModel对象中设置更新的Quote对象来更新 View 。
void _source_QuoteArrived(Quote quote)
{
QuoteViewModel qvm;
if (_quoteMap.TryGetValue(quote.Symbol, out qvm))
{
qvm.Quote = quote;
}
else
{
qvm = new QuoteViewModel();
qvm.Quote = quote;
this.Quotes.Add(qvm);
_quoteMap.Add(quote.Symbol, qvm);
}
}
当Quote对象已更新或我被迫创建字典时,是否有更好的方法从模型更新 View ?如果可以在更新Quote对象时立即更新listview,而不用将Quote子类化为INotifyPropertyChanged或DependencyObject,则将更加容易。
谢谢
最佳答案
对于第一个问题,请参阅this StackOverflow question。通常,人们似乎更喜欢INotifyPropertyChanged
。
至于第二个问题,鉴于报价可以随时到达,因此您需要某种方法将到达的报价映射到集合中已有的报价。使用字典似乎是一种明智的方法。您还有什么建议?
您声明最好立即更新ListView,但是ListView如何知道新Quote对应的对象? ListView纯粹监视实现INotifyCollectionChanged
的集合,它对Quote
或Quote.Symbol
的内部一无所知
关于wpf - 使用ObservableCollection数据绑定(bind)从线程更新datagrid,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10271678/