温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c# - Do I really need a static class to manage favorites?
c# design-patterns static xamarin.forms

c# - 我真的需要静态课程来管理收藏夹吗?

发布于 2020-04-10 23:46:01

嗨,有个概念问题。我使用专业应用程序来计算一些分数。我用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);
    });
}

所以我有两个问题:

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

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

谢谢您的帮助,半乳糖

查看更多

提问者
Galactose
被浏览
76
ToolmakerSteve 2020-02-02 06:59

并不需要是静态的。只需拥有一个非静态类的静态实例这是实现“单例模式”的一种方法。

细节:

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绑定仅看到propertiesObservableCollection必须为属性(具有吸气剂)。

您可能还需要使收藏夹管理器成为BindableObject:

 public class FavoritesManager : Xamarin.Forms.BindableObject