MVVM: Обработка логических дочерних объектов моделей в коллекциях - PullRequest
1 голос
/ 21 февраля 2011

Используя MVVM, один из типов ViewModel включает модель, которую они представляют как поле.

Итак, у меня есть CompanyModel и CompanyViewModel, у которых есть один экземпляр CompanyModel.

Эта CompanyModel имеет коллекцию подразделений, принадлежащих ей. Таким образом, CompanyModel имеет список (или некоторый класс коллекции).

Теперь CompanyViewModel хотела бы представить эти Подразделения как ObservableCollection<DivisionViewModel>; и вы можете добавить новые подразделения в CompanyViewModel.

Как лучше всего обеспечить синхронизацию ObservableCollection и коллекции Models? Поэтому, когда я добавляю новую DivisionViewModel и сохраняю ее, она автоматически сохраняет свою модель в List<Division>?

CompanyModel.

У меня есть больше классов, подобных этим отношениям Родитель / Дитя, поэтому мне бы хотелось что-то, что я мог бы использовать повторно или реализовать, возможно, в классе AbstractViewModel.

Примечание: мои ViewModels реализуют IEditableObject

1 Ответ

1 голос
/ 22 февраля 2011

Вероятно, самый простой способ сделать это - создать новый класс, который наследуется от ObservableCollection и который принимает список источников и различные функции инициализации и отображения в качестве параметров. Его подпись может выглядеть примерно так:

public class SynchronizedObservableCollection<TDest, TSource> : ObservableCollection
{
    public SynchronizedObservableCollection(
        IList<TSource> source, 
        Func<TSource, TDest> newDestFunc, 
        Func<TDest, TSource> newSourceFunc),
        Func<TSource, TDest, bool> mapSourceToDestFunc
    {
        // Initialize the class here.
    }
}

Затем вы захотите обработать событие CollectionChanged, создавая новые экземпляры Source при добавлении нового экземпляра Destination, удаляя существующие экземпляры Source при удалении существующего экземпляра Destination, и тому подобное. Вы использовали бы вышеупомянутые «новые» функции для создания новых экземпляров различных сущностей, и вы использовали бы функции «карты» выше в различных запросах Linq, которые позволили бы вам определить, скажем, какой экземпляр модели представления вашей ObservableCollection сопоставляется с моделью в вашем списке.

Вы бы использовали его в своем примере выше, например, так:

var divisionViewModels = new SynchronizedObservableCollection(
    company.DivisionList, 
    division => new DivisionViewModel(division),
    divisionVm => divisionVm.Model,
    (division, divisionVm) => divisionVm.Model == division);

Точная реализация оставлена ​​читателю в качестве упражнения :-). Но я использовал такие классы с некоторым успехом в предыдущих проектах. Просто убедитесь, что вы работаете над некоторыми хорошими модульными тестами, чтобы вы знали, что можете на него положиться, и вам не придется тратить много времени на охоту через стеки обработки вызовов.

...