在另一个站点/更新按钮上更新ObservableCollection

时间:2017-05-31 10:49:59

标签: c# sqlite mvvm uwp

我正在使用SQLite开发一个UWP应用程序,我正面临一个问题,我想要一些帮助 - 因为现在我发现了一个糟糕的解决方案。

我有一组电影,这些电影作为string FavMoviesIdString保存在我的数据库中(每个最喜欢的电影' ID被添加到字符串中并由";"分割 - 因为你不能保存整个电影模型列表) 用户可以通过其他站点(站点B)上的FavMoviesCollection查看这些电影。

方法LoadMovies获取这些电影并在FilteredMoviesList中显示。 (它绑定到ListView Mode=OneWay

如果用户第一次打开网站B,则会在构造函数中调用LoadMovies方法并显示所有电影,,用户可以将电影添加到自己的收藏夹中访问站点B后的站点A.问题:在网站A上添加电影后,列表不会更新。

打开应用程序 - >转到网站A并将电影添加到收藏夹 - >转到网站B - 显示电影 - >返回网站A并添加另一部电影 - >返回站点B,仅显示第一个电影。

"我需要做什么,如果添加了另一个项目,则列表会更新" "什么可以我是否重新初始化我的构造函数?" "我应该实施更新按钮来手动加载电影吗?"

public ObservableCollection <MovieModels> FilteredMoviesList
    {
        get { return _filteredMoviesList;}
        set 
        {
            _filteredMoviesList = value;
            RaisePropertyChanged("FilteredMoviesList")
        }
    }

    public void LoadMovies()
    {
        using(var db = new DataBaseContext())
        {
            ObservableCollection<MovieModel> movies = new ObservableCollection<MovieModel>();
            movies = DatabaseModel.GetSampleFavMovies();
            FilteredMoviesList = movies;
        }
    }

编辑:现在有效:

在导航到另一个页面时,我调用了LoadMovies方法 - 所以只有在离开网站后列表才会更新,这是不好的。

1 个答案:

答案 0 :(得分:1)

您的案例是何时在MVVM中使用消息传递的一个很好的例子。

当用户将电影从网站A添加到他们的收藏夹时,您应该发送一条消息。 B应该注册此消息并自行执行。

使用消息传递,您可以使用发布/订阅模式。要做到这一点,你不必实现它。您可以使用几个实现的MVVM库。

例如,您可以使用MVVM Light:

ViewModelBase继承您的ViewModel,然后您可以使用MessengerInstance发送和注册消息。

您在AViewModel中的代码(当用户将电影添加到收藏夹中时):

MessengerInstance.Send(new FavouritesListChangedNotification());

您在BViewModel中的代码(在consturctor中):

MessengerInstance.Register<FavouritesListChangedNotification>(this, scn => {/* here imlement you action when in site A the list of favorites changed*/});

FavouritesListChangedNotification是您自己的类,可以包含其他信息,例如电影列表。

这样就可以避免在ViewModel之间直接引用,从而导致松散耦合的ViewModel,从而更容易维护客户端代码。