繁体   English   中英

如何绑定到 ViewModel 的属性和 ViewModel 中集合项的属性?

[英]How can I bind to properties of the ViewModel and properties of collection items in the ViewModel?

我会尽力解释这一点...

我只是试图理解视图、视图模型和演示者,所以我创建了一个小程序来说明一些来龙去脉。 我的小应用程序基本上存储专辑。 专辑列在一个组合框中,我有艺术家、流派和年份的字段,它们都是文本框。 到目前为止,没有问题...我创建了一个绑定源并将其绑定到视图 model(具有标题、艺术家、流派和年份的属性),它按预期工作。 我可以循环浏览组合框,各种文本框将根据组合框的选择而变化。

然后我决定要为每张专辑添加歌曲列表,因此我向视图 model 添加了一个新的歌曲属性,并向视图添加了一个数据网格视图。 这是我变得非常困惑的地方。 如果我将用于其他所有内容的绑定源绑定到数据网格视图,它显然只想渲染视图 model 的直接字段(基本上重复我在文本框中显示的内容,仅以网格格式)。

假设我对问题的描述足够充分,我该怎么做才能在文本框中显示专辑字段并在数据网格视图中显示歌曲? 我想我已经得出结论,我只需要第二个绑定源,但如果可能的话,我想避免它。 我尝试了一些显而易见的事情,比如将数据网格视图的 DataMember 属性指向“Songs”(视图模型中歌曲集合的属性名称),但没有任何运气。

谁能指出我正确的方向?

我总是使用第二个 BindingSource 来完成此操作,该 BindingSource 将第一个 BindingSource 设置为 DataSource。

因此,ViewModel 加载并准备好代表专辑的模型,而 View 监视 ViewModel 并以用户可以理解的方式向用户呈现专辑。

首先,我们来看看Model。 您有一张专辑,其中包含一首或多首歌曲。

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

ViewModel 加载所有专辑的公共集合

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

ViewModel 是 View 的 DataContext。 控件绑定到专辑和 SelectedAlbum。 注意,如果 ViewModel 不必对 SelectedAlbum 进行操作,我们可以在 View 中处理当前选择的专辑。 这只是一个例子。

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

您的控件相对于 SelectedAlbum 绑定,以显示有关它的信息

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

您的 DataGrid 绑定到 SelectedAlbum 的 Songs 属性

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

一切都比预期的要好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM