2014-10-11 10 views
1

我是新來的WPF。我需要將UI的ListBox綁定到模型層深處的源代碼。WPF MVVM:視圖的源代碼深入模型的列表框。如何實施?

應用方案如下圖所示。描述:

我的MainWindowViewModel類有一個Scheduler屬性(Scheduler模型層中的類)。

Scheduler類有一個CurrentParser屬性(Parser模型層中的類)。

Parser類有一個Result字段(ParserResultMetaData模型層中的類)。

ParserResultMetaData類具有Log字段(LogList(Of String)

登錄只能從編程模型層來改變(增加了分析器線期間,它的工作)。

所以我的問題是如何將我的列表框綁定到此列表以匹配MVVM模式。 現在我得到它,ViewModel必須有一個ObservableCollection(Of String)女巫是我的模型層List(Of String)的副本。

enter image description here

+0

你的問題基本上是;如何將ViewModel中的列表綁定到View?該綁定可以在代碼和視圖中進行修改。 – CampDev 2014-10-12 02:21:16

回答

2

不知怎的,你需要當行被添加到集合通知UI。有多種方法可以實現這一點,但是如果從模型圖層中修改了集合,則需要一種機制以這種或另一種方式與其他圖層進行通信。

  • 在模型圖層中使用ObservableCollection。

雖然類型,如ObservableCollectionINotifyPropertyChanged廣泛應用於MVVM架構,他們沒有具體的給他們,並在某些情況下,它可以是有意義的模型層中直接使用它們。在您的Parser類中使用ObservableCollection是提供此通知機制的一種方法。然後您可以將ListBoxItemsSource直接綁定到Scheduler.Parser.Result.Log,並且它會相應更新。

  • 在您的ViewModel中創建包裝屬性。

如果你不想在你的模型中使用的ObservableCollection,你可以通過在你的ViewModel屬性暴露清單,例如:

public IEnumerable<string> ParserLog 
{ 
    get { return Scheduler.Parser.Result.Log; } 
} 

然後,你需要手動通知UI當一個項目被添加時,所以你需要一個事件(或者其他相同的東西),告訴你的ViewModel這個列表已經改變,並且它需要提升ParserLog屬性的PropertyChanged事件。在您的ViewModel中添加如下代碼:

this.Scheduler.Parser.ResultUpdated += (s, e) => this.RaisePropertyChanged("ParserLog"); 

這將告訴ListBox更新ParserLog屬性中的項目。

+0

這正是我需要的。謝謝,丹尼爾! – AsValeO 2014-10-12 20:55:02

相關問題