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

Я пишу приложение 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
}

Метод AddAlbumEntry в ALbumView находится в другом классе, который является подключением к моей базе данных. Я уже использую ObservableCollection, но не знаю, как сказать, что база данных обновлена.

Заранее спасибо!

1 Ответ

0 голосов
/ 05 ноября 2019

Просто хочу ответить на мой вопрос. Я просто изменил свой метод AddAlbum, чтобы использовать событие «Деактивировано», чтобы перезагрузить коллекцию после закрытия диалога, например:

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

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

    addAlbum.ShowDialog(vm);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...