Запретить изменения значения

269
23 июня 2017, 05:59

Имею List<Class>, который раз в N минут обновляется путем десериализации JSON файла, у коллекции реализован INotifyPropertyChanged для грамотного привязывания к этой коллекции интерфейса. А также есть некий эвент, который оповещает о добавление в эту коллекцию нового значения.

После того, как в коллекцию добавляется новое значение, мне нужно выполнить несколько операций: Для начала мне надо пройтись по 2-ум значениям в коллекции и выяснить, не пустые ли они, а дальше, нужно отдельно созданной переменной (которая изначально пуста) задать то значение, которое не пустое.

То есть другими словами у меня есть в коллекции все события, у событий есть предмет, но предмет может находится в двух разных местах в JSON файле, узнаем в каком месте значение не NULL и выводим его и его кол-во в отдельную переменную Reward.

НО значение имеет не читаемый для пользователя формат (/DAF/FAFWF/FQFQ), для решения этой задачи мне пришлось создавать список фильтров (JSON файл в формате "значение": "перевод" и небольшую функцию, которая находит в файле нужное значение и отдает перевод.

Всю логику я вроде сделал как надо, все работает на ура! Но после первого же обновления, моя переменная в которую я заносил необходимые мне данные становится попросту пустой. Тут дело понятное, коллекция вроде обновляется, обновляются и данные, но как быть, если мне нужно сохранить подобные переменные без выполнения заново всего кода по "переводу"? Я пытался задать private static string переменную в модели, в которую я с помощью set задаю значение, а с помощью get получаю его и вывожу, если не пустое. Но такой способ сохранил только 1 значение и задал его для всей коллекции сразу. Собственно как быть?

Код чтения данных из JSON с реализацией INotifyPropertyChanged из этого примера

internal class Game : VM
{
    private static GameView Read(string fileName)
    {
        GameView data;
        using (var file = File.OpenText(fileName))
        {
            var serializer = new JsonSerializer();
            data = (GameView) serializer.Deserialize(file, typeof(GameView));
        }
        return data;
    }
    GameView data;
    public GameView Data { get => data; set => Set(ref data, value); }
    public void Load(string filename = "temp")
    {
        if (filename == "temp")
            filename = $"{Settings.Program.Directories.Temp}/GameData.json";
        Data = Read(filename);
    }
}

Класс, который содержит коллекцию Alerts

public class GameView : VM
{
    int version;
    public int Version
    {
        get => version;
        set => Set(ref version, value);
    }
    // ...
    ObservableCollection<Alert> alerts;
    public ObservableCollection<Alert> Alerts
    {
        get => alerts;
        set => Set(ref alerts, value);
    }
    // ...
}

Класс Alerts:

public class Alert : VM
{
    [JsonProperty("_id")]
    public Id Id { get; set; }
    public Activation Activation { get; set; }
    public Expiry Expiry { get; set; }
    public MissionInfo MissionInfo { get; set; }
}

Ну и собственно класс MissionInfo, в котором есть переменная Reward

public class MissionInfo : VM
{
    public MissionReward MissionReward { get; set; }

    private string _reward;
    public string Reward
    {
        get => _reward;
        set => Set(ref _reward, value);
    }
}
public class MissionReward
{
    public int Credits { get; set; }
    public List<CountedItem> CountedItems { get; set; }
    public List<string> Items { get; set; }
}

Дальше я не буду описывать, как именно идет отслеживание добавления нового элемента (ибо это еще добавит кучу строк в вопрос и я считаю это избыточным). Кому интересно, можно почитать в ответе тут.

Я опишу только мой набросок того, как я изменяю значение Reward при срабатывание эвента:

private void NotificationWatcherwatcherOnAlertNotificationArrived(object sender,
            NewAlertNotificationEventArgs e)
        {
            var ntfVm = new NotificationViewModel(e.Notification);
            Debug.WriteLine("Новая тревога найдена!", ntfVm.Text);
            var alert = GameData.Data.Alerts.Single(cc => cc.Id.Oid == ntfVm.Id);
            Debug.WriteLine($"Переводим значение {ntfVm.Text}!", $"[{DateTime.Now}]");
            try
            {
                string revardValue = "Нет награды.";
                if (alert.MissionInfo.MissionReward.CountedItems != null)
                {
                    revardValue = $"{FiltersViewModel.Items.Find(alert.MissionInfo.MissionReward.CountedItems[0].ItemType, DataBase)} [{alert.MissionInfo.MissionReward.CountedItems[0].ItemCount}]";
                }
                else if (alert.MissionInfo.MissionReward.Items != null)
                {
                    revardValue = FiltersViewModel.Items.Find(alert.MissionInfo.MissionReward.Items[0], DataBase);
                }
                alert.MissionInfo.Reward = revardValue;
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
        }

Собственно видно, что я смотрю, пустые ли коллекции alert.MissionInfo.MissionReward.CountedItems и alert.MissionInfo.MissionReward.Items, если одна из них не пуста, то alert.MissionInfo.Reward присваиваю значение из этой коллекции, если пуста - выдается "Награды нет". Собственно задает все как надо, но из за того, что периодически выполняется подгрузка значений (самый первый код) - коллекция сбрасывает все изменения к изначальному и заданный Reward становится пустым.

READ ALSO
Получить нужный текст из байтов

Получить нужный текст из байтов

Подскажите как получить нужный мне текст

226
Скачать файл с учетом авторизации C#

Скачать файл с учетом авторизации C#

ЗдравствуйтеЕсть страничка, с которой необходимо скачать файл, предварительно авторизовавшись

239
Ресурсы стилей или странное поведение

Ресурсы стилей или странное поведение

У меня в компании есть библиотека с разными "кастомными" контролами для WPF"Кастомные", они лишь потому что там изменена визуальная составляющая,...

235
NoDoubleTreeView [требует правки]

NoDoubleTreeView [требует правки]

google не находит NoDoubleTreeView

182