嗨,有个概念问题。我使用专业应用程序来计算一些分数。我用C#/ Xamarin.Forms来做。我要管理收藏夹,以便用户可以在有限的分数列表中更快地找到其收藏夹。
我有4个标签:
因此,我希望用户在“收藏夹”列表中添加/删除乐谱时,在第一和第二个选项卡中对此进行更改。目前,我有这个:
public static class FavoritesManager
{
public static ObservableCollection<string> FavoritesList = new ObservableCollection<string>();
// Indexer does not work because static class ==> this is one of the problems
// public bool this[string key] { get => this.Favs.Contains(key); }
}
// My ViewModel
public class ScoreListViewModel : ViewModelBase
{
// Each Category is a List<Score>. Score has 3 properties : string Title, string Detail, bool IsFavorite
public ObservableCollection<Category> Categories { get; set; }
public ScoreListViewModel()
{
this.InitializeCategories();
FavoritesManager.FavoritesList.CollectionChanged += OnFavoritesChanged;
}
// When favorites list has changed ==> event CollectionChanged
public void OnFavoritesChanged(object sender, NotifyCollectionChangedEventArgs e)
{
this.InitializeCategories();
}
public void InitializeCategories()
{
this.Categories = new ObservableCollection<Category>
{
new Category ("Cat1")
{
new Score("Foo", "Bar", FavoritesManager.FavoritesList.Contains("Foo"))
}
};
}
// Command used to add a favorite
public ICommand AddToFavorites => new Command<string>((fav) =>
{
FavoritesManager.FavoritesList.Add(fav);
});
}
所以我有两个问题:
如何避免ViewModel依赖于静态类favoriteManager?我是否真的需要一个静态类,还是有另一种方法可以通过不同的视图实时“共享”它?因为如果我决定更改收藏夹管理,则当列表中有30-40的分数时,这将非常困难...
有没有一种方法可以避免每次仅更改1项(1个收藏夹)时就完全重新初始化“类别”列表?我认为这主要是一个XAML /绑定问题...
谢谢您的帮助,半乳糖
本类并不需要是静态的。只需拥有一个非静态类的静态实例。这是实现“单例模式”的一种方法。
细节:
public class FavoritesManager
{
// The only instance. Readonly, because it is never re-assigned.
public readonly static It => new FavoritesManager();
// "get", so that it is a `property`. This is necessary for `ObservableCollection` to be seen via binding.
public readonly ObservableCollection<string> FavoritesList {get;} = new ObservableCollection<string>();
// Private, so no other instances can be created.
private FavoritesManager()
{
}
...
}
用法:
... FavoritesManager.It...
然后执行您习惯执行的所有操作,例如定义索引器。并通过引用一个实例(来自其他类的代码)FavoritesManager.It
。
关于您的Binding
问题,我的答案可能不完整。但是,请注意我所做的一项更改:XAML绑定仅看到properties:ObservableCollection
必须为属性(具有吸气剂)。
您可能还需要使收藏夹管理器成为BindableObject:
public class FavoritesManager : Xamarin.Forms.BindableObject