2011-08-16 95 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”...) –

相关问题