wpf - 使用 ObservableCollection 数据绑定(bind)从线程更新数据网格

标签 wpf data-binding mvvm

我是 WPF 和 MVVM 的新手,我从 "Jason Dolinger on Model-View-ViewModel" 开始文章和示例,但我对数据绑定(bind)有一些疑问。

1) 在他的演示应用程序中,他将 ObservableCollection 项的 DependencyObject 子类化。与 INotifyPropertyChanged 相比有哪些优点/缺点?

2)从数据网格/ ListView 中的模型更新 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)从线程更新数据网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10271678/

相关文章:

javascript - 是否有相当于 Spring :bind for binding forms and data on the front end?

mvvm - 使用 Unity 2.0 对 "Blendable"ViewModelLocator 的建议

android - java.lang.RuntimeException : Cannot create an instance of ViewModel class 错误

objective-c - 带有 UITableView 的 ReactiveCocoa MVVM

c# - 与 WPF 属性异步

c# - 将 powershell 脚本的输出绑定(bind)到 asp.net c# 中的 gridview

wpf - 关于 WPF xaml 中的数据模板或样式的问题

c# - 如何在应用程序外壳中实现繁忙指示器

wpf - 将 ItemsControl 中的新项目滚动到 View 中

c# - 将 FlowDocument 转换为 PDF 的最佳方式是什么