使用ObservableCollection数据绑定从线程更新datagrid

时间:2012-04-22 20:07:49

标签: wpf data-binding mvvm

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

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

2)在datagrid / listview中从模型更新视图的最佳方法是什么?在他的例子中,他在添加或更新Quote对象时注册为监听器:

_source.QuoteArrived += new Action<Quote>(_source_QuoteArrived);

比ViewModel创建QuoteViewModel对象并将其添加到集合中或通过使用名为_quoteMap的字典在方便的QuoteViewModel对象中设置更新的Quote对象来更新视图。

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对象更新或者我被迫创建一个词典时,是否有更好的方法从模型更新视图?如果在更新Quote对象时可以立即更新列表视图,那么将会更容易...没有引用子类INotifyPropertyChanged或DependencyObject。

由于

1 个答案:

答案 0 :(得分:1)

关于第一个问题,请参阅this StackOverflow question。通常人们似乎更喜欢INotifyPropertyChanged

至于你的第二个问题,鉴于引号可以随时到达,你需要一些方法来映射到达集合中已有引号的引号。使用字典似乎是一种明智的方法。你还有什么建议吗?

您声明ListView立即更新会很好,但ListView如何知道新Quote对应的对象? ListView纯粹监视实现INotifyCollectionChanged的集合,它对QuoteQuote.Symbol

的内部一无所知