2016-02-05 5 views
2

Прежде всего, я приношу свои извинения за мой бедный английский, который не является моим первым языком.Перейдите через UserControl с MVVM LIGHT (WPF)

Я новичок в MVVM так что мой вопрос, вероятно, очень новичку один;)

Я сталкиваюсь некоторые проблемы с переключением View в # Применение C с использованием WPF и MVVM LIGHT. Я читал много статей, но до сих пор не могу понять, как это сделать чистым способом.

Так вот мой вопрос: Что является лучшим способом для достижения навигации между UserControl, содержащейся в MainWindows, при условии, что:

  • У меня есть ViewModel для каждого UserControl и один для главного окна.
  • Кнопки для переключения между UserControls содержатся в самом UserControl
  • У меня есть ViewModelLocator
  • мне нужно иногда уничтожить/повторно создать UserControl в ViewModel
  • Я хочу уважать MVVM шаблон.
  • Я хочу, чтобы держать его просто
+0

Проверьте это: https://rachel53461.wordpress.com/2011/07/17/navigation-with-mvvm/ – Jose

+0

Я уже прочитал эту статью, но это не говорит о MVVM Light, и нет ViewModelLocator. Это не то, что я ищу. Но спасибо за попытку помочь мне :) – Speuline

ответ

4

Поскольку никто не отвечает на мой вопрос, это то, что я наконец-то сделал. Возможно, это не лучший способ, но, по крайней мере, он работает хорошо. Я надеюсь, что это помогает некоторым новичкам, как я, которые пытаются учить эту модель:

Поставьте 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)); 
    } 

Это все.

Смежные вопросы