Добавить элемент в базу данных / сетку данных на основе выбора в другой сетке данных - PullRequest
0 голосов
/ 28 октября 2019

У меня есть приложение WPF, в котором у меня есть две сетки данных. Первый показывает Альбомы, а второй - соответствующие Песни, основываясь на выборе в первой сетке данных. Я также могу добавить альбом, который затем сохраняется в базе данных. Теперь я хочу выбрать альбом в первой сетке данных и добавить песню в этот альбом во второй сетке данных. Все песни имеют AlbumID в качестве внешнего ключа в моей базе данных. Я не знаю, как обрабатывать этот параметр AlbumID при добавлении песни в базу данных, мой запрос вылетает, как и ожидалось. Я хотел бы знать, как я могу сказать SongViewModel добавить песню с AlbumID, заданным SelectedAlbum.

Запрос на добавление альбома:

   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 для подключения к представлению:

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

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Я нашел решение. В AlbumListViewModel я открываю диалоговое окно, где я могу добавить песни. Я связал AlbumId из SongModel с AlbumID из моей AlbumModel через выбранный альбом. Теперь я могу выбрать альбом и добавить песню с соответствующим AlbumID. Метод команды добавления песни с помощью кнопки «Добавить» выглядит следующим образом:

    private void AddSong()
    {
        addSong.ShowDialog(new SongViewModel(new SongData { AlbumID = SelectedAlbum.AlbumID }));
    }
0 голосов
/ 28 октября 2019

Я бы попытался создать модель View, которую легко привязать к пользовательскому интерфейсу. Модель представления должна иметь свойства SelectedAlbum и SelectedSong, поэтому при создании новой песни у вас уже будет информация в модели представления о выбранном альбоме, а затем вы можете установить идентификатор альбома для модели песни.

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...