2012-04-22 51 views
3

我是WPF和MVVM的新手,我開始使用"Jason Dolinger on Model-View-ViewModel"文章和示例,但我對數據綁定有一些疑問。使用ObservableCollection數據綁定從線程更新datagrid

1)在他的演示應用程序中,他爲ObservableCollection Items的DependencyObject繼承了子類。與INotifyPropertyChanged相比有什麼優點/缺點?

2)在datagrid/listview中更新模型視圖的最佳方法是什麼?在他的榜樣,他註冊爲當引用對象添加或更新的監聽器:

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

比視圖模型創建並添加QuoteViewModel對象的集合或通過在方便的設置更新的報價對象更新視圖QuoteViewModel對象使用名爲_quoteMap的字典。

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); 
    } 
} 

是否有更好的方法來更新從模型視圖時報價對象已更新或我不得不創建一個dictionnary?如果在更新Quote對象時可以立即更新列表視圖,而不需要引用INotifyPropertyChanged或DependencyObject的子類,那將更容易。

感謝

回答

1

關於第一個問題,請this StackOverflow question。一般人們似乎更喜歡INotifyPropertyChanged

至於你的第二個問題,考慮到報價可以在任何時候到達,你需要一些方法來映射報價到你的集合中已有的報價。使用字典似乎是一個明智的方法來做到這一點。你會怎麼建議?

您聲明ListView可以立即更新,但ListView如何知道新Quote對應的對象是什麼? ListView控件純粹手錶實現INotifyCollectionChanged的集合,因此它不知道的Quote,或Quote.Symbol

+0

的內部也許我可以創造我MainWindowViewModel事件,當報價更新觸發此事件。我可以在我的MainWindow中監聽該事件並調用dataGrid1.Items.Refresh();這是個好主意嗎 ? – DnBase 2012-04-23 11:41:03

+0

但是,每次更新一個項目時都會刷新整個網格不會丟失任何已編輯的內容嗎? (從未使用網格) – GazTheDestroyer 2012-04-23 12:36:36

相關問題