我正在使用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
方法 - 所以只有在离开网站后列表才会更新,这是不好的。
答案 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,从而更容易维护客户端代码。