Для меня это звучит так, будто вы думаете об этом неправильно.Когда вы спрашиваете «Как создавать ViewModels и управлять ими для моделей, которые реализуют таблицы БД с множеством взаимосвязей», звучит так, как будто вы думаете о ViewModel в терминах моделей.Что не правильно.ViewModel - это модель View, а не Model.Вы не должны думать о создании ViewModel для ваших моделей, вы должны думать о создании VewModel из ваших Views.
На самом деле модель даже не доходит до конца.Начните с вашего пользовательского интерфейса - вашего просмотра.Затем вы создаете логическое представление этого представления в коде, чтобы вы могли связать его с вашей моделью представления.Затем, наконец, вы реализуете свою модель представления, обращаясь к своей модели, чтобы делать то, что когда-либо должно быть сделано.Когда вы придете к дизайну следующего представления, даже если оно может содержать некоторые из тех же данных, что и первый, вы все равно создадите для него новую модель - другую модель представления.Теперь новая ViewModel может включать некоторые из тех же свойств в первой ViewModel, что хорошо.Помните, что это модель представления, а не модели.
Рассмотрим приложение для работы с электронной почтой с двумя представлениями, сводкой и подробностями.Поскольку существует 2 разных представления, у вас есть 2 разных модели представления, даже если оба извлекают данные из одной базовой модели.
Model SummaryViewModel DetailsViewModel
----- --------------- ----------------
RecipientAddress RecipientAddress
SenderAddress SenderAddress SenderAddress
Subject Subject Subject
Content Content
Теперь сводное представление является только сводкой и не отображает RecipientAddress илиСодержимое, следовательно, эти свойства не существуют в SummaryViewModel.Подробное представление отображает больше информации, поэтому имеет больше свойств.Эта же идея отвечает на ваш вопрос о внешних ключах.Внешние ключи никогда не отображаются в вашем представлении, поэтому вы не должны быть членами вашей модели представления.Ваша ViewModel заботится только о том, что требуется для View.
В ответ на ваш вопрос «как вы управляете моделями представления»: вы этого не делаете.Вам не нужно.Экземпляры ViewModel обычно (не всегда) имеют отношение один к одному с представлениями, поэтому вам не нужно управлять ими.Они живут только до тех пор, пока живет вид.Вы просто создаете новый экземпляр ViewModel при загрузке представления (обычно в обработчике события OnNavigatedTo, см. Ниже) и сохраняете его в DataContext представления.Если загружены два экземпляра представления, то существует две модели представления.Когда View является GC'ом, ViewModel тоже (если у вас нет утечки памяти).
Наконец, что касается того, как вы должны синхронизировать изменения, это может быть сложно в настольном приложении Silverlightгде многие виды могут отображаться одновременно.К счастью, на Windows Phone у нас обычно только один открытый вид (хотя и не всегда).Таким образом, мы можем просто сказать нашей ViewModel обновлять каждый раз, когда на страницу переходят:
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (DataContext == null)
DataContent = new MyViewModel(); //Create new instance of the ViewModel
else
(MyViewModel)DataContext.Refresh(); //Refresh the existing ViewModel
}
В большинстве случаев это работает хорошо, для более сложных сценариев вы можете посмотреть на инфраструктуру обмена сообщениями, предоставляемую инструментарием, таким как Prism илиMvvmLight.
Надеюсь, это помогло.