2011-08-16 110 views
0

我會盡力解釋這一點,因爲我可以...如何綁定ViewModel的屬性和ViewModel中的集合項的屬性?

我只是試圖理解意見,查看模型和主持人,所以我創建了一個小程序來說明一些來龍去脈。我的小應用程序基本上存儲相冊。專輯列在一個組合框中,我有藝術家,流派和年份的字段,這些都是文本框。直到現在,沒有任何問題......我創建了一個綁定源並將其綁定到視圖模型(它具有標題,藝術家,流派和年份的屬性),並且按預期工作。我可以在組合框中循環,各種文本框將根據組合框的選擇而改變。

然後我決定爲每張專輯添加歌曲列表,因此我向視圖模型添加了新的歌曲屬性,並向視圖添加了數據網格視圖。這是我變得非常困惑的地方。如果我結合我所提供的一切到數據網格視圖綁定源,它顯然只是想渲染視圖模型的即時字段(基本上重複什麼我顯示在文本框中,僅在網格格式)。

假設我充分描述了問題,我該怎麼做才能在文本框和數據網格視圖中的歌曲中顯示專輯字段?我想我已經得出結論,我只需要第二個綁定源,但如果可能的話,我想避免它。我嘗試過很明顯的事情,例如將數據網格視圖的DataMember屬性指向「歌曲」(視圖模型中歌曲集合的屬性名稱),但沒有任何運氣。

任何人都可以指向正確的方向嗎?

回答

0

因此,視圖模型加載並準備代表相冊中的模型,並查看手錶視圖模型,並呈現給用戶的相冊的方式,他們能理解。

首先,讓我們看看模型。你有一個專輯,有一個或多個歌曲。

public sealed class Album 
{ 
    public string Name {get;set;} 
    public string Artist {get;set;} 
    public IEnumerable<Song> Songs {get;set;} 
} 

public sealed class Song 
{ 
    public string Name {get;set;} 
    public TimeSpan Length {get;set;} 
} 

視圖模型加載了所有的相冊

public sealed class ViewModel : INotifyPropertyChanged 
{ 
    public ObservableCollection<Album> Albums {get;set;} 
    public Album SelectedAlbum {get;set;} // implement INPC for this property 
} 

視圖模型是DataContext的用於查看的公開徵集。控件綁定到相冊和SelectedAlbum。請注意,如果ViewModel不必對SelectedAlbum進行操作,我們可以在視圖中處理當前選定的所有專輯。這只是一個例子。

<ComboBox 
    ItemsSource="{Binding Albums}" 
    SelectedItem="{Binding SelectedAlbum}" /> 

你的管制,以它

<TextBlock Text="{Binding SelectedAlbum.Name}" /> 

你的DataGrid綁定到SelectedAlbum

<DataGrid ItemsSource="{Binding SelectedAlbum.Songs}" /> 

而一切的歌曲屬性顯示的信息綁定相對於SelectedAlbum比預期還好。

+0

感謝您的回覆。我使用的是WinForms,但是這個例子顯然已經足夠清楚,我可以在結合你的和Charles的答案後實現它。 –

0

我總是使用第二個BindingSource來完成這個工作,它將第一個BindingSource設置爲DataSource。

+0

我創建第二結合源和由它的源數據源中的第一綁定源。然後,我綁定新的綁定源到數據網格視圖...沒有任何改變。它只是重複原始綁定源中可用的屬性。 –

+0

@Brent是否將Songs集合設置爲第二個BindingSource的DataMember? –

+0

我一直試圖從一開始就這樣做 - 指定要呈現的歌曲屬性。基於顯示成員的描述,它聽起來像我想要的。 唯一的問題是,在第二個綁定源和數據網格視圖上(一旦第二個綁定源綁定到它),Visual Studio中的顯示成員屬性中沒有任何內容可用。我可以手動輸入,但沒有任何反應(我假設我只需鍵入「Songs」作爲顯示成員值,因爲屬性本​​身被命名爲「Songs」...) –

相關問題