Вероятно, самый простой способ сделать это - создать новый класс, который наследуется от 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);
Точная реализация оставлена читателю в качестве упражнения :-). Но я использовал такие классы с некоторым успехом в предыдущих проектах. Просто убедитесь, что вы работаете над некоторыми хорошими модульными тестами, чтобы вы знали, что можете на него положиться, и вам не придется тратить много времени на охоту через стеки обработки вызовов.