Как и где располагать ViewModel? - PullRequest
0 голосов
/ 30 мая 2011

Шаблон MVVM прекрасно работает с MVVM Light лучше, но иногда мне кажется, что я ничего не понимаю. У меня есть бизнес-приложение в SL 4, где у меня к настоящему времени 18 ВМ .. и еще, чтобы написать! Я применяю шаблон, который Лоран Бюньон использовал в своей сессии на MIX11 (с классом SimpleIoc).

Модель представления привязывается к представлению (назовите его «A»), но та же самая модель представления также привязывается к другому представлению (назовите ее «B»). Viewmodel, связанный с представлением «A», вызывается стандартным способом в ViewModelLocator. Viewmodel, связанный с представлением B, вызывается с другим ключом, чтобы быть уверенным, что это 2 разных экземпляра. Кроме того, они внедряются в разные службы DomainService, поэтому сущности, связанные с элементами управления в представлении, различны.

Модель представления регистрирует некоторые сообщения для отслеживания изменений в других моделях представления, с которыми она взаимодействует, например, изменение выбора означает, что пользователь хочет отображать другие данные для извлечения данных из БД).

Проблема в том, что если я вызываю представление A, а затем представление B, я регистрируюсь для одних и тех же сообщений 2 раза, поэтому у меня 2 операции с БД.

Что я считаю правильным, так это избавиться от модели представления, связанной с представлением A, когда я вызываю представление B (обычно, когда я закрываю представление A). Но я действительно не знаю, где его утилизировать, когда и как! Хорошо ... я мог представить, когда и как ... но ГДЕ?

Если вы думаете, что я в замешательстве, вы правы!

1 Ответ

1 голос
/ 30 мая 2011

Если я правильно вас понимаю, вы используете одну и ту же модель представления с двумя разными представлениями. Вы хотите, чтобы за один раз существовала только одна копия виртуальной машины.

В этом случае я бы, вероятно, использовал бы родительский объект виртуальной машины и изменил бы что-то вроде свойства Mode на виртуальной машине.

<DataTemplate x:Key="ViewA" TargetType="{x:Type local:MyViewModel}">
     <TextBlock Text="I'm View A" />
</DataTemplate> 

<DataTemplate x:Key="ViewB" TargetType="{x:Type local:MyViewModel}">
     <TextBlock Text="I'm View B" />
 </DataTemplate>

<DataTemplate DataType="{x:Type local:MyViewModel}">
     <ContentControl Content="{Binding }">
         <ContentControl.Style>
             <Style TargetType="{x:Type ContentControl}">
                 <Setter Property="ContentTemplate" Value="{StaticResource ViewA}" />
                 <Style.Triggers>
                     <DataTrigger Binding="{Binding Mode}" Value="2">
                         <Setter Property="ContentTemplate" Value="{StaticResource ViewB}" />
                     </DataTrigger>
                 </Style.Triggers>
             </Style>
         </ContentControl.Style>
     </ContentControl>
 </DataTemplate>

Затем, чтобы переключить представления, я просто установил бы ParentViewModel.CurrentViewModel.Mode = 2, и представление просто переключалось без изменения ViewModel.

Если вам нужны две разные копии одной и той же ViewModel, я бы все равно обработал переключение в ParentViewModel, используя что-то вроде ParentViewModel.CurrentViewModel = ViewModelInstanceB, и установил бы ViewModelInstanceB.Mode в 2

Я написал несколько примеров переключения между представлениями здесь , если вам интересно

...