Я закончил тем, что использовал часть решения, предложенного Джо Уайтом, немного иначе
Решением было просто оставить модели такими, какими они были в начале, и прикрепить к коллекциям обработчик событий для CollectionChanged внутренних коллекций, например PatternViewModel будет:
public class PatternViewModel : ISerializable
{
public Pattern Pattern { get; set; }
public ObservableCollection<TrackViewModel> Tracks { get; set; }
public PatternViewModel(string name)
{
Pattern = new Pattern(name);
Tracks = new ObservableCollection<TrackViewModel>();
Pattern.Tracks.CollectionChanged += new NotifyCollectionChangedEventHandler(Tracks_CollectionChanged);
}
void Tracks_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
foreach (Track track in e.NewItems)
{
var position = Pattern.Tracks.IndexOf((Track) e.NewItems[0]);
Tracks.Insert(position,new TrackViewModel(track, this));
}
break;
case NotifyCollectionChangedAction.Remove:
foreach (Track track in e.OldItems)
Tracks.Remove(Tracks.First(t => t.Track == track));
break;
case NotifyCollectionChangedAction.Move:
for (int k = 0; k < e.NewItems.Count; k++)
{
var oldPosition = Tracks.IndexOf(Tracks.First(t => t.Track == e.OldItems[k]));
var newPosition = Pattern.Tracks.IndexOf((Track) e.NewItems[k]);
Tracks.Move(oldPosition, newPosition);
}
break;
}
}
}
Таким образом, я могу прикрепить новый Цвет / Стиль / Команду к моделям вида для поддержания чистоты моих базовых моделей
И всякий раз, когда я добавляю / удаляю / перемещаю элементы в коллекции базовых моделей, коллекции моделей представлений синхронизируются друг с другом
К счастью, мне не нужно управлять большим количеством объектов в моем приложении, поэтому дублирование данных и производительность не будут проблемой
Мне это не очень нравится, но оно работает хорошо, и это не огромный объем работы, просто обработчик событий для модели представления, которая содержит другие коллекции моделей представления (в моем случае, один для синхронизации с PatternViewModel TrackViewModels и другая в TrackViewModel для управления HitViewModels)
Все еще интересуются вашими мыслями или лучшими идеями =)