【问题标题】:Add Item to database/datagrid based on selection in other datagrid根据其他数据网格中的选择将项目添加到数据库/数据网格
【发布时间】:2019-10-28 10:21:25
【问题描述】:

我有一个 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");
        }
    }

【问题讨论】:

    标签: c# wpf entity-framework mvvm


    【解决方案1】:

    我会尝试创建易于绑定到 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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      我找到了解决方案。在 AlbumListViewModel 中,我打开可以添加歌曲的对话框。我通过 Selected Album 将来自 SongModel 的 AlbumId 绑定到来自我的 AlbumModel 的 AlbumID。现在我可以选择一张专辑并添加一首具有相应专辑 ID 的歌曲。使用“添加”按钮添加歌曲的命令方法如下:

          private void AddSong()
          {
              addSong.ShowDialog(new SongViewModel(new SongData { AlbumID = SelectedAlbum.AlbumID }));
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多