【问题标题】:Refresh datagrid when changes to database are made对数据库进行更改时刷新数据网格
【发布时间】:2023-04-03 05:17:01
【问题描述】:

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

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

相册列表视图模型

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

它会打开专辑视图,我在其中将专辑添加到数据库中。

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,但不知道如何告诉它数据库已更新。

提前致谢!

【问题讨论】:

  • 如果专辑是网格所知道的,那么只需向其中添加一个项目,或者使用获取该集合的方法并在初始化和数据更改时调用它以刷新。
  • 您可以使用事件。让AlbumListViewModel 订阅AlbumViewModel 修改数据库时引发的事件。更好地使用特殊类来更新数据库,例如DatabaseController。然后AlbumListViewModel 订阅其DatabaseChangedAlbumViewModelcalls 是AddAlbumEnyry()

标签: c# wpf entity-framework mvvm


【解决方案1】:

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

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

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

    addAlbum.ShowDialog(vm);
}

【讨论】:

    猜你喜欢
    • 2017-02-12
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    相关资源
    最近更新 更多