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

3

我刚接触WPF和MVVM,开始看了Jason Dolinger的Model-View-ViewModel文章和示例,但我对数据绑定有一些疑问。

1)在他的演示应用程序中,他为ObservableCollection项目子类化DependencyObject。与INotifyPropertyChanged相比,这样做有什么利弊?

2)如何在datagrid/listview中从模型更新视图是最好的方法?在他的示例中,当添加或更新Quote对象时,他会注册为侦听器:

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

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

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对象时立即更新,那就太容易了...而不需要让Quote子类化INotifyPropertyChanged或DependencyObject。

谢谢

1个回答

1

关于你的第一个问题,参见这个 StackOverflow 问题。一般人们似乎更喜欢使用INotifyPropertyChanged

至于你的第二个问题,考虑到报价可能随时到来,您需要一些方法将到达的报价映射到已经在您的集合中的报价。使用字典似乎是一个明智的做法。你还有什么其他建议吗?

你提到希望ListView立即更新,但是ListView如何知道新报价对应哪个对象呢?ListView只是观察实现了INotifyCollectionChanged的集合,它对QuoteQuote.Symbol的内部情况一无所知。


也许我可以在我的MainWindowViewModel中创建一个事件,并在更新报价时触发此事件。然后我可以在我的MainWindow中监听该事件并调用dataGrid1.Items.Refresh(); 这是个好主意吗? - Hervé Donner
但这将在每次更新一个项目时刷新整个网格,那不会丢失任何已经存在的编辑吗?(从未使用过网格) - GazTheDestroyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接