Pourquoi mettre en œuvre une interface sur le viewmodel et les afficher dans mvvm

Je suis assez nouveau dans le pattern MVVM, de sorte s'il vous plaît garder avec moi. J'ai vu implemnentations dans wpf +mvvm + prisme où tous les points de vue ont tendance à avoir un IView que tout en haut de l'interface. Ensuite, les points de vue dans les différents modules ont un point de vue spécifique de l'interface comme IViewA, IViewB etc qui mettent en œuvre les IView interface. Même le viewmodel a IViewModel en haut de l'interface et de la suite des modules ont IViewAViewModel , IViewBViewModel etc qui héritent de la IViewmodel. IViewmodel a une référence à Iview et le Iview a une référence à IViewModel.

namespace xxx.xxx.infrastructure
{
public interface IView
{
  IViewModel ViewModel {get;set;}
}

public interface IViewModel 
{
  IView View {get;set;}
}

public abstract class ViewModelBase : IViewModel, INotifyPropertyChanged
{

   public IView View {get;set;}

   public ViewModelBase(IView view)
   {
     View = view;
     View.ViewModel = this;
   }
   //INotifyPropertyChanged left out
 }
}

namespace xxx.xxx.Modules.Customer
{
   public interface ICustomerDetailsView : IView
   {

   }

   public partial Class CustomerDetailsView : UserControl, ICustomerDetailsView 
   {
       public CustomerDetailsView ()
       {
         InitializeComponent();
       }

       //Is this implementation acceptable?The view is supposed to have zero code in       the code behind.....
        public IViewModel ViewModel
        {
          get
          {
            return (ICustomerDetailsViewViewModel)DataContext; 
          }
          set
          {
             DataContext = value;
          }
        }

    }  

    public interface ICustomerDetailsViewViewModel : IViewModel
    {
       string Message {get;set;}
    }

     public class CustomerDetailsViewViewModel : ViewModelBase,       ICustomerDetailsViewViewModel 
    {
      //Will be injected by unity as i have set up mappings in module initilize.
      public CustomerDetailsViewViewModel(ICustomerDetailsView view)
          :base(view)
      {
      }

       public string Message
       {
          //INotifyPropertyChanged left out for brevity
          get;set;
       }
   }

J'ai quelques questions.

1.)Ce n'est pas une violation de MVVM en tant que fichier code-behind, est censé avoir zéro code?

2.)dans MVVM modèle de vue ne devrait pas s'inquiéter de la vue ou de son contrat?Ne marche pas au-dessus de la mise en œuvre de la casser?

3.)Je ne comprends pas qu'est-ce que l'utilisation de cette mise en œuvre. En fait, c'frontières sur le titre de MVP et beaucoup de code est nécessaire.

4.)Si c'est une façon acceptable de mettre en œuvre, ai-je besoin d'avoir des interfaces pour tous les points de vue et viewmodel dans tous mes modules.?

Je n'ai pas travaillé avec WPF beaucoup, mais je suis d'accord sur ton avis comme une pratique de la conception. VM ne devrait pas avoir une référence à la Vue, et je ne vois pas l'utilité, à moins que vous n'êtes PAS à l'aide de liaisons bidirectionnelles correctement. Concernant les interfaces de partout... c'est la triste vérité de la statique des langues où les contrats doivent être sous la forme d'interfaces. L'unité devrait être exigeant interfaces pour la DI trucs..
Sa en fait pas la mise en œuvre concrète de la vue, mais seulement une interface de la vue. Je peux argumenter en disant que cela satisfait MVVM parce que la VM n'a aucune idée à propos de la Fenêtre/Page qui implémente IView
Oui, mais encore le point de vue du modèle doit savoir sur le contrat de la vue. Ce qui signifie plus d'accouplement qu'avec un indépendant ViewModel. Pourquoi avez-vous besoin que lorsque les liaisons bidirectionnelles sont en place? Imaginez quand vous avez besoin de plusieurs points de vue à partager le même modèle de vue (par exemple, étroitement liées à de multiples composants de l'INTERFACE utilisateur dans la même fenêtre).. Ne sais pas comment ça fonctionne en WPF, mais je n'ai utilisé que comme une pratique puissante en Javascript frameworks MVVM.
un "Modèle de Vue" n'est pas le modèle; il s'agit plus d'un "contrôleur" ou "présentateur" qui découple la vue à partir du modèle réel. Bien sûr, un vrai modèle est facultative et dans de nombreuses situations de la VM agit en tant que modèle...
Absolument d'accord avec vous, pas besoin d'injecter tout IView dans le ViewModel. MVVM basé sur le modèle de Modèle de Présentation, de sorte que la Vue de soucis de synchronisation de l'état avec Vue(Présentation)Modèle. ViewModel juste besoin de lever de l'événement qu'il a été modifié et d'Afficher sinchronize (via un événement d'abonnement ou de liaison). Si IView injecte dans le ViewModel, cela signifie que le ViewModel de soucis de synchronisation avec les états-elle, et la regarde comme MVP de la Supervision du Contrôleur.

OriginalL'auteur Hari Subramaniam | 2012-07-13