Поскольку никто не отвечает на мой вопрос, это то, что я наконец-то сделал. Возможно, это не лучший способ, но, по крайней мере, он работает хорошо. Я надеюсь, что это помогает некоторым новичкам, как я, которые пытаются учить эту модель:
Поставьте CurrentViewModel объект в MainViewModel:
public class MainViewModel : ViewModelBase,IMainViewModel
{
/* Other piece of code */
private ViewModelBase _currentViewModel;
public ViewModelBase CurrentViewModel
{
get
{
return _currentViewModel;
}
set
{
_currentViewModel = value;
RaisePropertyChanged(() => CurrentViewModel);
}
}
}
Очевидно связывать это с MainView (Только соответствующий код):
<UserControl Content="{Binding Path=CurrentViewModel}"/>
Поместите DataTemplate в App.XAML:
<Application.Resources>
<ResourceDictionary>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
<DataTemplate DataType="{x:Type localViewModel:HomeViewModel }">
<localView:AccueilView/>
</DataTemplate>
<DataTemplate DataType="{x:Type localViewModel:ErrorViewModel }">
<localView:ErrorView/>
</DataTemplate>
</ResourceDictionary>
</Application.Resources>
Зарегистрируйте ViewModel с простыми МОК в ViewModelLocator:
if (ViewModelBase.IsInDesignModeStatic)
{
SimpleIoc.Default.Register<IHomeViewModel, DesignHomeViewModel>();
}
else
{
SimpleIoc.Default.Register<IHomeViewModel, HomeViewModel>();
}
Установите поглотитель всей ViewModel в ViewModelLocator Статический (только один для Exemple)
public static IHomeViewModel Home
{
get{return ServiceLocator.Current.GetInstance<IHomeViewModel>();}
}
Поскольку это статичный может получить доступ к ViewModel вы хотите от MainViewModel:
public class MainViewModel : ViewModelBase,IMainViewModel
{
public ViewModelBase HomeVM
{
get
{
return (ViewModelBase)ViewModelLocator.Home;
}
}
}
Обеспечить возможность Разрегистрируйте ViewModel и воссоздает его:
public static void CleanUpHome()
{
SimpleIoc.Default.Unregister<HomeViewModel>();
SimpleIoc.Default.Register<IHomeViewModel, HomeViewModel>();
}
«ребенок» вид Модель общается с MainViewModel через сообщения:
public class ErrorViewModel : ViewModelBase, IErrorViewModel
{
/*Other piece of code */
public void HomeReturn()
{
var msg = new ChangeView(ChangeView.EnumView.Home);
Messenger.Default.Send<ChangeView>(msg);
ViewModelLocator.CleanUpErrors();
}
}
MainViewModel Регистрация на сообщение и обрабатывает его:
public class MainViewModel : ViewModelBase,IMainViewModel
{
public MainViewModel()
{
Messenger.Default.Register<ChangeView>(this, (action) => ReceiveMessage(action));
CurrentViewModel = HomeVM;
}
private void ReceiveMessage(ChangeView viewName)
{
switch (viewName.switchView)
{
case ChangeView.EnumView.Home:
CurrentViewModel = HomeVM;
break;
case ChangeView.EnumView.Error:
CurrentViewModel = ErrorVM;
break;
}
Messenger.Default.Unregister<ChangeView>(this, (action) => ReceiveMessage(action));
}
Это все.
Проверьте это: https://rachel53461.wordpress.com/2011/07/17/navigation-with-mvvm/ – Jose
Я уже прочитал эту статью, но это не говорит о MVVM Light, и нет ViewModelLocator. Это не то, что я ищу. Но спасибо за попытку помочь мне :) – Speuline