MVVM: как избежать использования ObservableCollection в модели в сценарии списка списков? - PullRequest
0 голосов
/ 03 декабря 2018

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

Первые Я реализовал ObservableCollections непосредственно в модели:

public class MyBaseListModel
{
    ObservableCollection<MyBaseModel> MyBaseList;
    // other members
}

И затем виртуальная машина:

public class MyViewModel
{
    public ObservableCollection MyListsfList;

    public MyViewModel(List<MyBaseListModel> l)
    {
        MyListofList = new ObservableCollection(l);
    }
    ....
 }

И это работает нормально.

Тогда я прочитал, что нехорошо применять ObservableCollections непосредственно в модели, и я согласен.Поэтому я изменил модели для использования списка:

public class MyBaseListModel
{
    List<MyBaseModel> MyBaseList;
    // other members
}

Но теперь я не могу редактировать подсписки сиглов, поскольку MyListofList [i] .MyBaseList сам по себе является простым списком, а не ObservableCollection.

Должен ли я перестраивать каждый отдельный элемент MyBaseListModel в конструкторе модели представления, чтобы заменить Список на ObservableCollection?

Или я должен встроить в ВМ коллекцию оболочек ObservableCollection на MyBaseList?

Илия должен иерархически составлять разные ViewModel, создавая MyBaseListViewModel, который обертывает каждый отдельный объект MyBaseListModel, используя ObservableCollection?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

ObservableCollection имеет конструктор, который принимает IEnumerable, так что вы можете просто передать свой список.

Не знаю, кто сказал вам, что модель не должна иметь ObservableCollection, но они действительно сказали, что вы ошиблись.Фактически, это то, что поддерживается EF и NHibernate из коробки.

Больший вопрос в том, почему вы считаете хорошей идеей иметь модель v1, которую нельзя наблюдать, а затем создать точный клонэта модель v2 только для того, чтобы сделать ее наблюдаемой, а затем продолжать переводить между ними.

Фактически, ЕДИНСТВЕННОЕ время, когда вам не следует использовать объекты модели EXACT в вашей виртуальной машине, - это когда их нужно переупаковывать./ преобразовано.И если их нужно переупаковать / трансформировать, вам, вероятно, следует заново подумать, почему вы не построили их таким образом.

0 голосов
/ 03 декабря 2018

Основное различие между ObservableCollection<T> и List<T> заключается в том, что первый реализует интерфейс INotifyCollectionChanged и выдает уведомления в пользовательский интерфейс при добавлении или удалении элементов.Если вам это нужно, вы должны использовать ObservableCollection<T>.Если вы этого не сделаете, вы можете использовать List<T>.Оба типа реализуют интерфейсы IList<T> и `ICollection 'и могут быть изменены.

Нет ничего плохого в добавлении ObservableCollection<T> к классу, подобному MyBaseListModel, при условии, что это тип, специфичный для клиента.Если MyBaseListModel - это некоторый вид доменного объекта, который совместно используется различными проектами как на стороне клиента, так и на стороне сервера, вам следует рассмотреть возможность обернуть его в модель представления, то есть «дочернюю» модель представления MyViewModel, вна стороне клиента вместо изменения фактического объекта домена.

Редко полезно привязывать напрямую к объектам домена, бизнеса или передачи данных в приложении WPF.Как правило, это лучший подход для создания объектов-оболочек, специфичных для пользовательского интерфейса, и привязки к ним, по крайней мере, если по какой-то причине вы не можете использовать «оригинальный» объект как есть.

...