我真的需要静态类来管理收藏夹吗?

问题描述 投票:0回答:1

你好,有受孕问题。我使用专业应用程序来计算一些分数。我用C#/ Xamarin.Forms来做。我想管理收藏夹,以便用户可以在有限的分数列表中更快地找到其收藏夹。

我有4个标签:

  1. 整个分数列表==>导航到所选分数
  2. 收藏夹列表==>也可以导航
  3. &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);
    });
}

所以我有2个问题:

  1. 如何避免将ViewModel依赖于静态类favoriteManager?我是否真的需要一个静态类,还是有另一种方法可以通过不同的视图实时“共享”它?因为如果我决定更改收藏夹管理,那么当列表中有30-40的分数时,这将非常困难...

  2. 是否有一种方法可以避免在我仅更改1项(1个收藏夹)时完全重新初始化类别列表?我认为,这主要是一个XAML /绑定问题...

感谢您的帮助,半乳糖

c# design-patterns xamarin.forms static
1个回答
0
投票

class不必是静态的。就像在常规(非静态)类上一样,只需具有一个静态实例。也就是说,从类行中删除static,但将其保留在列表中。

详细信息:

public class FavoritesManager
{
    // The only instance.
    public readonly static It => new FavoritesManager();

    public readonly ObservableCollection<string> FavoritesList = new ObservableCollection<string>();

    private FavoritesManager()
    {
    }

    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.