Мне действительно нужен класс stati c для управления избранным? - PullRequest
1 голос
/ 01 февраля 2020

Привет, есть проблема с зачатием. Я работаю над профессиональным приложением, чтобы подсчитать несколько баллов. Я делаю это с 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 от stati c класса FavoritesManager? Мне действительно нужен класс stati c или есть другой способ «поделиться» им в режиме реального времени с помощью разных представлений? Потому что, если я решу изменить управление фаворитами, когда в списке будет 30-40 баллов, это будет очень сложно ...

  2. Есть ли способ избежать полной повторной инициализации список категорий каждый раз, когда я меняю только 1 вещь (1 любимую)? Я думаю, это в основном вопрос XAML / Binding ...

Спасибо за вашу помощь, Галактоза

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Большое спасибо за вашу помощь. Ранее я слышал об одноэлементном паттерне, но никогда не использовал его ... Он идеально подходит для этого использования!

Тем не менее, я сделал небольшие изменения, чтобы лучше реализовать его в C# (взято из https://jlambert.developpez.com/tutoriels/dotnet/implementation-pattern-singleton-csharp/ решение № 4):

public sealed class FavoritesManager
{
    // Instance for Singleton pattern
    public static FavoritesManager Instance { get; } = new FavoritesManager();

    // Singleton pattern : no other instance permitted ==> static & private constructor
    static FavoritesManager()
    { }

    private FavoritesManager()
    { }

    // Collection of all favorites
    public ObservableCollection<string> Favorites { get; private set; } = new ObservableCollection<string>();

    // If needed, access from indexer
    public bool this[string key]
    {
        get => this.Favorites.Contains(key);
    }
}
1 голос
/ 02 февраля 2020

Класс не обязательно должен быть c. Просто имейте один статус c экземпляр не статического c класса. Это один из способов реализации «шаблона Singleton».

Подробности:

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 видят только свойства : ObservableCollection должно быть свойством (есть получатель).

You может также потребоваться сделать FavoritesManager объектом BindableObject:

 public class FavoritesManager : Xamarin.Forms.BindableObject
...