Имею 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
становится пустым.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
ЗдравствуйтеЕсть страничка, с которой необходимо скачать файл, предварительно авторизовавшись
У меня в компании есть библиотека с разными "кастомными" контролами для WPF"Кастомные", они лишь потому что там изменена визуальная составляющая,...