INotifyPropertyChanged и INotifyCollectionChanged для моделей данных

#c# #.net-5

#c# #.net-5

Вопрос:

Допустим, у меня есть простой класс данных, который я использую для отправки данных через websocket:

 class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public List<Person> Relatives { get; set; }
}
 

Я сериализуюсь в JSON для связи с websocket.

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

Обычно я бы просто реализовал INotifyPropertyChanged свойства и использовал a ObservableCollection<Person> вместо a List<Person> . Но мне это кажется неправильным. Серверу не нужны INotifyPropertyChanged ObservableCollection служебные данные и. Но я также не хочу переписывать классы как BindablePerson .

Есть ли предпочтительный способ обойти эту проблему?

Комментарии:

1. Может быть, вы реализуете INotifyPropertyChanged с флагом включение / отключение событий повышения и включаете его только при переходе в пользовательский интерфейс?

2. Это сработало бы для свойств, но как насчет List<Person> ?

3. Вы можете подкласс ObservableCollection из T и переопределить эти методы: защищенное переопределение void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { если (PreventEvents) возвращает; база. OnCollectionChanged(e); } защищенное переопределение аннулирует OnPropertyChanged(PropertyChangedEventArgs e) { если (PreventEvents) возвращает; база. OnPropertyChanged(e); }

4. Но это все равно не дает такой же функциональности, как List<T> . И кажется, что должен быть более простой способ, я не могу быть единственным, кто сталкивается с этой проблемой? Я думаю, я бы предпочел создать BindablePerson, чем переопределять ObservableCollection.

5. Выбор наилучшего способа работы с коллекциями полностью зависит от вас, это зависит от многих факторов в вашей архитектуре. Удачи с реализацией.