2009-06-10 8 views
3

Je suis actuellement en phase de planification pour un de mes projets. J'ai pensé à utiliser le modèle MVVM pour mon application de testabilité, de maintenabilité, etc. J'ai seulement commencé à comprendre MVVM mais il y a une chose que je ne peux pas comprendre dans le contexte de mon projet. application.MVVM-pattern pour une application WPF Paint-like?

Mon application vise à aider les entraîneurs sportifs à planifier leurs exercices en leur permettant de capturer visuellement des exercices. C'est une sorte de peinture pour les entraîneurs sportifs. J'ai déjà réfléchi à la façon d'implémenter les différents PaintObjects (c'est ce que je les appelle) pour mon application (par exemple: Ball, Player etc.) et j'ai trouvé le moyen le plus pratique de le faire est d'écrire une classe avec un nombre de DependencyProperties, puis en fournissant un XAML-ControlTemplate pour cette classe. Maintenant, quand je pense à la structuration de l'écran de peinture de mon application, j'ai pensé que j'utiliserais quelque chose comme PaintView.xaml avec un PaintViewModel.cs. Maintenant, la question est de savoir comment PaintViewModel stocke les PaintObjects? Qu'est-ce que PaintObjects de toute façon? Sont-ils ViewModels eux-mêmes? Sont-ils des modèles? Sont-ils des points de vue?

C'est la partie où je suis totalement coincé dans l'esprit et dans l'espoir d'obtenir des conseils par des utilisateurs MVVM plus expérimentés. Merci d'avance!

Meilleures salutations, crischu

Répondre

6

Conserver une séparation entre vos machines virtuelles (qui should be POCOs) et des vues. Vos machines virtuelles ne devraient pas avoir une forte dépendance vis-à-vis de vos vues, car cela les rend difficiles à tester isolément. Par conséquent, vous aurez besoin de quelque chose dans votre machine virtuelle pour représenter les différents éléments de vos scènes (BallViewModel, PlayerViewModel, etcetera). Celles-ci pourraient être exposés à partir d'un SceneViewModel:

public class SceneViewModel : ViewModel 
{ 
    public ICollection<SceneObjectViewModel> SceneObjects 
    { 
     get { ... } 
    } 

    ... 
} 

public abstract class SceneObjectViewModel : ViewModel 
{ 
    ... 
} 

public class BallViewModel : SceneObjectViewModel 
{ 
    ... 
} 

Ensuite, votre SceneView se lierait à cette collection et de rendre chaque élément à l'aide d'un DataTemplate:

<ItemsControl ItemsSource="{Binding SceneObjects}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemContainerStyle> 
     <Style> 
      <Setter Property="Canvas.Top" Value="{Binding Top}"/> 
      <Setter Property="Canvas.Left" Value="{Binding Left}"/> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
</ItemsControl> 

ci-dessus XAML suppose que vos DataTemplate s sont définis ailleurs, et chaque SceneObjectViewModel a une propriété Top et Left.

Questions connexes