c# - 根据其他数据网格中的选择将项目添加到数据库/数据网格
问题描述
我有一个 WPF 应用程序,其中有两个数据网格。第一个显示专辑,第二个显示对应的歌曲,基于第一个数据网格中的选择。我还可以添加一个相册,然后将其保存到数据库中。现在我想在第一个数据网格中选择一张专辑,并在第二个数据网格中向该专辑添加一首歌曲。在我的数据库中,所有歌曲都有一个 AlbumID 作为外键。在将歌曲添加到数据库时,我不知道如何处理此参数 AlbumID,我的查询按预期崩溃。我想知道如何告诉 SongViewModel 添加带有 SelectedAlbum 给出的 AlbumID 的歌曲。
查询添加相册:
public AlbumData AddAlbumEntry(AlbumData albumData)
{
album albumEntry = new album
{
AlbumName = albumData.AlbumName,
Year = albumData.AlbumYear,
};
_context.albums.Add(albumEntry);
_context.SaveChanges();
return new AlbumData
{
AlbumID = albumEntry.AlbumID,
AlbumYear = albumEntry.Year,
AlbumName = albumEntry.AlbumName,
};
}
查询添加歌曲:
public SongData AddSongEntry(SongData songData)
{
song songEntry = new song
{
SongName = songData.SongName,
SongNumber = songData.SongNumber,
};
_context.songs.Add(songEntry);
_context.SaveChanges();
return new SongData
{
SongID = songEntry.SongID,
SongNumber = songEntry.SongNumber,
SongName = songEntry.SongName,
};
}
AlbumViewModel 连接到 View:
public AlbumData AddAlbumEntry(AlbumData albumData)
{
var controller = new BandManagerController();
return controller.AddAlbumEntry(albumData);
}
public void AlbumToDatabase(AlbumData data)
{
AddAlbumEntry(data);
ExecuteCancelCommand();
}
SongViewModel 连接到视图:
public SongData AddSongEntry(SongData songData)
{
var controller = new BandManagerController();
return controller.AddSongEntry(songData);
}
public void SongToDatabase(SongData data)
{
AddSongEntry(data);
ExecuteCancelCommand();
}
我还有一个 SelectedAlbum 属性来填充 SongLists:
public AlbumViewModel SelectedAlbum
{
get
{
return _selectedAlbum;
}
set
{
if (_selectedAlbum != value)
{
_selectedAlbum = value;
}
NotifyPropertyChanged("SelectedAlbum");
}
}
解决方案
我会尝试创建易于绑定到 ui 的 View 模型。视图模型应该具有 SelectedAlbum 和 SelectedSong 属性,因此当您创建新歌曲时,您将在视图模型中获得有关所选专辑的信息,然后您可以在歌曲模型上设置专辑 ID。
class ViewModel : BindableBase
{
private IDatabase _database;
private Album _album;
private Song _song;
public ObservableCollection<Album> Albums { get; private set; }
public ObservableCollection<Song> AlbumSongs { get; private set; }
public ICommand AddAlbumCommand {get; private set;}
public ICommand AddSongCommand {get; private set;}
public Album SelectedAlbum
{
get => _album;
set { LoadAlbumSongs(album); SetProperty(ref _album, value); }
}
public Song SelectedSong
{
get => _song;
set => SetProperty(ref _song, value);
}
public ViewModel(IDatabase database)
{
_database = database;
Albums = new ObservableCollection<Album>();
AlbumSongs = new ObservableCollection<Song>();
AddAlbumCommand = new RelayCommand (() => AddNewAlbum(), () => true);
AddSongCommand = new RelayCommand (() => AddNewSong(), () => SelectedAlbum != null);
}
public void AddNewAlbum()
{
SelectedAlbum = new Album();
}
public void AddNewSong()
{
SelectedSong = new Song();
SelectedSong.AlbumID = SelectedAlbum.AlbumID;
}
public void SaveAlbum()
{
if (SelectedAlbum.ID == 0) {
Albums.Add(SelectedAlbum);
}
_database.SaveAlbum(SelectedAlbum);
}
public void SaveSong()
{
if (SelectedSong.ID == 0) {
AlbumSongs.Add(SelectedSong);
}
_database.SaveSong(SelectedSong);
}
}
推荐阅读
- python - PySimpleGUI 中的代码处理过多的值
- azure - 如何计算我的 Web APP 所需的 ACU
- python-3.x - 找到值超出为每列指定的范围的数据框行
- cookies - 无法将 JMeter 令牌值作为 cookie 发送
- python - 尝试在本地服务器中运行时如何解决 psycopg2 错误?
- flutter - 将用户上传到 Flutter Web 的图片存储为实际的 .jpg 文件
- artifactory - 在 JFrog Artifactory 中,我们可以自定义虚拟存储库中的工件文件夹吗
- android - 过滤 Logcat 日志 android
- lua - 这些是什么类型的元方法,它们为什么存在以及它们是如何创建的
- c++ - 将预先存在的套接字与节俭服务器一起使用?