У меня есть две таблицы в моей базе данных.Один исполнитель, содержащий идентификатор и имя исполнителя, вторая таблица альбомов, содержащая внешний ключ artistid.Я соединил два комбо-бокса так, чтобы на каждого исполнителя показывались только их альбомы.Это работает.У меня есть trackviewmodel для добавления треков.Но у меня есть имя исполнителя в моей первой таблице, в которой еще нет альбома, и когда я выбираю этого исполнителя из выпадающего списка, я получаю нулевое исключение (объект не установлен).Как я могу заполнить первых художников комбинированного списка только тогда, когда во второй таблице существует этот artistid.На мой взгляд, я связываюсь с коллекцией Artists, поэтому имеет смысл извлечь все значения из коллекции, но я хочу только те, где artistid существует в коллекции альбомов.
Извините за длинный пост, я впервые задаю здесь вопрос, но я действительно застрял.Заранее спасибо за помощь
это для c #, шаблон mvvm, структура сущностей.Я уже пробовал это, но не могу понять, как подключить это к первому комбинированному списку:
public ICollection<Album> AlbumWithArtist()
{
return context.Albums.Where(p => p.ArtistId >= 1 && p.ArtistId.HasValue).ToArray();
}
//Dataclasses
public class Artist
{
public int Id { get; set; }
public string ArtistName { get; set; }
public ICollection<Album> Albums { get; set; }
}
public class Album
{
public int Id { get; set; }
public Artist Artist { get; set; }
public virtual int? ArtistId { get; set; }
public string AlbumName { get; set; }
public Genre Genre { get; set; }
public virtual int? GenreId { get; set; }
public int NumberOfTracks { get; set; }
}
//TrackViewModel
public class TrackViewModel : ViewModel
{
private List<Artist> _artists;
private Artist _selectedArtist = new Artist();
private Album _selectedAlbum = new Album();
private readonly BusinessContext context;
private ICollection<Track> _tracks;
private int _trackNumber;
private string _trackName;
public TrackViewModel() : this(new BusinessContext())
{
}
public TrackViewModel(BusinessContext context)
{
this.context = context;
this.Artists = new List<Artist>();
this.Albums = new CustomObservableCollection<Album>();
Tracks = new ObservableCollection<Track>();
GetArtistList();
GetAlbumByArtist();
}
private bool _uploaded = false;
public bool Uploaded
{
get { return _uploaded; }
set { _uploaded = value; }
}
public ICollection<Track> Tracks
{
get { return _tracks; }
set { _tracks = value; }
}
public List <Artist> Artists
{
get
{
return _artists;
}
set
{
_artists = value;
}
}
public Artist SelectedArtist
{
get
{
return _selectedArtist;
}
set
{
_selectedArtist = value;
this.Albums.Repopulate(_selectedArtist.Albums);
}
}
public Album SelectedAlbum
{
get
{
return _selectedAlbum;
}
set
{
_selectedAlbum = value;
NotifyPropertyChanged("SelectedArtist");
}
}
public int TrackNumber
{
get { return _trackNumber; }
set { _trackNumber = value; }
}
public string TrackName
{
get { return _trackName; }
set { _trackName = value; }
}
public ActionCommand AddTrackCommand
{
get
{
return new ActionCommand(p => AddTrack());
}
}
private void AddTrack()
{
using (var api = new BusinessContext())
{
var track = new Track
{
ArtistId = SelectedArtist.Id,
AlbumId = SelectedAlbum.Id,
TrackNumber = TrackNumber,
TrackName = TrackName,
Uploaded = Uploaded
};
try
{
api.AddTrack(track);
}
catch (NotSupportedException)
{
throw new NotSupportedException();
}
Tracks.Add(track);
}
}
private void GetArtistList()
{
Artists.Clear();
foreach (var ar in context.GetArtistList())
Artists.Add(ar);
}
private void GetAlbumList()
{
Albums.Clear();
foreach (var al in context.GetAlbumList())
Albums.Add(al);
}
private void GetAlbumByArtist()
{
Albums.Clear();
foreach (var al in context.AlbumWithArtist())
Albums.Add(al);
}
}
//Class CustomObservableCollection<T>
public class CustomObservableCollection <T>: ObservableCollection <T>
{
public CustomObservableCollection() : base()
{
}
public CustomObservableCollection(IEnumerable<T> collection) : base (collection)
{
}
public CustomObservableCollection(List<T> list) :base(list)
{
}
public void Repopulate(IEnumerable<T> collection)
{
this.Items.Clear();
foreach (var item in collection)
this.Items.Add(item);
this.OnPropertyChanged(new PropertyChangedEventArgs("Count"));
this.OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
//TrackView simplified
<Grid>
<StackPanel Margin="20">
<Label>Artist</Label>
<ComboBox ItemsSource="{Binding Artists}" DisplayMemberPath="ArtistName" SelectedValuePath="ArtistId" SelectedItem="{Binding SelectedArtist}">
</ComboBox>
<Label>Album</Label>
<ComboBox ItemsSource="{Binding Albums}" DisplayMemberPath="AlbumName" SelectedItem="{Binding SelectedAlbum}">
</ComboBox>
<Label>TrackNumber</Label>
<TextBox Text="{Binding TrackNumber}">
</TextBox>
<Label>TrackName</Label>
<TextBox Text="{Binding TrackName}">
</TextBox>
<CheckBox IsChecked="{Binding Uploaded}">
</CheckBox>
<TextBlock>
<Hyperlink Command="{Binding AddTrackCommand}">Add Track</Hyperlink>
</TextBlock>
</StackPanel>
</Grid>