如何使用2个或更多型号
本文关键字:多型 何使用 2个 | 更新日期: 2023-09-27 18:28:19
我在这里和网上做了一些搜索,但要么我使用了错误的关键字,要么MVVM上的大多数示例只处理一个模型。
我的项目中有两个模型(MVVM上的自学项目),歌曲模型和艺术家模式。到目前为止,我们已经能够将列表视图与一组信息(来自歌曲)绑定,这样,当用户点击列表视图上的一行时,关于歌曲的信息就会填充在几个文本框控件中。
我面临的问题是,如何在两个模型之间进行沟通?如果我们把一个模型看作是一个有列/字段的表,那么我应该能够创建对艺术家模型的引用(外键),但我没有得到的是,当我在列表视图中点击艺术家的歌曲时,我如何检索关于他的信息?
长话短说,我喜欢点击列表视图中显示歌曲列表的一行,然后获取歌手/艺术家的照片、他的真实姓名等。我不遵循如何在艺术家模型中查找歌曲相关数据的概念。
任何建议都将受到重视。
这就是我现在拥有的:
public class Song
{
string _singerId;
string _singerName;
string _songName;
string _songWriter;
string _genre;
int _songYear;
Artist artistReference;
然后我有:
public class Artist
{
string _artistBirthName;
string _artistNationality;
string _artistImageFile;
DateTime _artistDateOfBirth;
DateTime _artistDateOfDeath;
bool _isArtistAlive;
谢谢。
编辑:
以下是我提供信息的方式:
问题是如何在歌曲集中插入艺术家参考?
Artists = new ObservableCollection<Artist>()
{
new Artist() { ArtistBirthName = "Francis Albert Sinatra", ArtistNickName = "Ol' Blue Eyes", ArtistNationality = "American", ... },
new Artist() { ArtistBirthName = "Elvis Aaron Presley", ArtistNickName = "", ArtistNationality = "American", ... },
new Artist() { ArtistBirthName = "James Paul McCartney", ArtistNickName = "", ArtistNationality = "British", ... },
new Artist() { ArtistBirthName = "Thomas John Woodward", ArtistNickName = "", ArtistNationality = "British", ... }
};
//later read it from xml file or a table.
Songs = new ObservableCollection<Song>()
{
new Song() {ARTIST INFO GOES HERE? HOW?, SingerName = "Fank Sinatra", SongName="Fly me to the Moon", SongWriterName="Bart Howard", Genre="Jazz" ,YearOfRelease= 1980 },
new Song() {SingerName = "Elvis Presley", SongName="Can't Help Falling in Love", SongWriterName="Paul Anka", Genre="Pop", YearOfRelease= 1969},
new Song() {SingerName = "The Beatles", SongName="Let It Be", SongWriterName="John Lennon", Genre="Rock", YearOfRelease= 1970},
new Song() {SingerName = "Tom Jones", SongName="Its Not Unusual", SongWriterName="Les Reed & Gordon Mills", Genre="Pop" , YearOfRelease= 1965}
};
我要么在这里错过了什么,要么你只是在寻找真正没有的困难。:)创建歌曲对象时,只需将艺术家传递给它。例如Artist artist1 = new Artist(...); Song song1 = new Song(..., artist1);
当然,您需要首先定义构造函数。
编辑:编辑后:)
你可以这样做:
using System.Linq; // For lambda operations
(...)
Songs = new ObservableCollection<Song>()
{
new Song() {Artist = Artists.FirstOrDefault(x => x.Name == "Francis Albert Sinatra"), SingerName = ...}
(...)
}
Artists.FirstOrDefault(...)
部分是一个LINQ查询。它在Artists
集合上迭代,并选择集合中与条件匹配的第一个项。如果找不到匹配项,则使用默认值,该值应为NULL。不过,最好给每个艺术家一个唯一的ID,并根据它而不是名字进行搜索,因为可能会有更多的艺术家使用相同的名字。如果你有更多的问题,请不要犹豫!