更改数据库时刷新数据网格

时间:2019-10-29 14:33:32

标签: c# wpf entity-framework mvvm

我正在编写一个wpf应用程序,其中有音乐专辑和相应的歌曲。我可以添加专辑和相应的歌曲。但是现在我想在对数据库进行更改时刷新视图。我找到了许多可能的解决方案,但是由于我是wpf和c#的新手,所以我不知道哪一个适合我的代码。

在MainView中,有一个相册列表和一个添加按钮,该按钮打开另一个窗口,我可以在其中添加带有文本框的数据。

AlbumListViewModel

    #region Constants

    IWindowManager addAlbum = new WindowManager();

    IWindowManager addSong = new WindowManager();

    private AlbumViewModel _selectedAlbum;

    private SongViewModel _selectedSong;

    #endregion

    #region Constructor

    public AlbumListViewModel()
    {
        Albums = new ObservableCollection<AlbumViewModel>(GetAlbumList());
        AddAlbumCommand = new RelayCommand(x => AddAlbum());
        AddSongCommand = new RelayCommand(x => AddSong());
    }

    #endregion
    #region Properties

    public ICommand AddAlbumCommand { get; private set; }

    public ICommand AddSongCommand { get; private set; }

    public ObservableCollection<AlbumViewModel> Albums { get; set; }

    public AlbumViewModel SelectedAlbum
    {
        get
        {
            return _selectedAlbum;
        }

        set
        {
            if (_selectedAlbum != value)
            {
                _selectedAlbum = value;
            }

            NotifyPropertyChanged("SelectedAlbum");
        }
    }

    public SongViewModel SelectedSong
    {
        get
        {
            return _selectedSong;
        }

        set
        {
            if (_selectedSong != value)
            {
                _selectedSong = value;
            }

            NotifyPropertyChanged("SelectedSong");
        }
    }

    #endregion

    #region Methods
    public List<AlbumViewModel> GetAlbumList()
    {
        var controller = new BandManagerController();
        return controller.GetAlbumList()
            .Select(a => new AlbumViewModel(a))
            .ToList();
    }

    private void AddAlbum()
    {
        addAlbum.ShowDialog(new AlbumViewModel(new AlbumData()));
    }

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

它将打开AlbumView,在其中将相册添加到数据库中。

public class AlbumViewModel : Screen
{
    #region Constants

    private AlbumData _data;

    #endregion

    #region Constructor

    public AlbumViewModel(AlbumData data)
    {
        _data = data;
        SongListVM = new SongListViewModel(data.AlbumID);
        SaveAlbumToDatabase = new RelayCommand(x => AlbumToDatabase(data));
    }

    #endregion

    #region Properties

    public SongListViewModel SongListVM { get; set; }

    public ICommand SaveAlbumToDatabase { get; private set; }

    public string AlbumName
    {
        get
        {
            return _data.AlbumName;
        }

        set
        {
            if (_data.AlbumName != value)
            {
                _data.AlbumName = value;
                NotifyOfPropertyChange("AlbumName");
            }
        }
    }

    public int AlbumID
    {
        get
        {
            return _data.AlbumID;
        }
        set
        {
            if (_data.AlbumID != value)
            {
                _data.AlbumID = value;
                NotifyOfPropertyChange("AlbumID");
            }
        }
    }

    public string AlbumYear
    {
        get
        {
            return _data.AlbumYear;
        }

        set
        {
            if (_data.AlbumYear != value)
            {
                _data.AlbumYear = value;
                NotifyOfPropertyChange("AlbumYear");
            }
        }
    }

    #endregion

    #region Methods

    public AlbumData AddAlbumEntry(AlbumData albumData)
    {
        var controller = new BandManagerController();
        return controller.AddAlbumEntry(albumData);
    }

    public void ExecuteCancelCommand()
    {
        (GetView() as Window).Close();
    }

    public void AlbumToDatabase(AlbumData data)
    {
        AddAlbumEntry(data);
        ExecuteCancelCommand();
    }

    #endregion
}

ALbumView中的AddAlbumEntry方法位于另一个类中,该类是与我的数据库的连接。我已经使用过一个ObservableCollection,但不知道如何告诉它数据库已更新。

谢谢!

1 个答案:

答案 0 :(得分:0)

只想回答我的问题。我只是将AddAlbum方法更改为使用Deactivated事件,以在对话框关闭后重新加载Collection,例如:

private void AddAlbum()
{
    var vm = new AlbumViewModel(new AlbumData());

    vm.Deactivated += (s, e) => GetAlbumList();

    addAlbum.ShowDialog(vm);
}