我是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的集合,它对QuoteQuote.Symbol的内部一无所知

关于wpf - 使用ObservableCollection数据绑定(bind)从线程更新datagrid,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10271678/

10-17 01:11