2010-05-12 5 views
3

Je commence à réécrire l'ensemble de mon application métier silverlight dans le modèle MVVM; Mon premier point d'arrêt est le suivant:Ajout dynamique de vues dans Silverlight et MVVM

J'ai une page (View1) avec le ViewModel1 correspondant (avec une propriété 'IEnumerable AllData');

Maintenant, dans cette vue, je veux avoir un contrôle Tree-View, dans lequel un nœud sera rempli avec un autre View2; La question est: 1. Comment faire? - Je ne peux pas parcourir la propriété AllData car il est chargé de manière asynchrone ... - donc je ne connais pas le nombre de View2s 'à insérer - Je ne sais pas comment le faire depuis ViewModel1 :(

  1. Ai-je besoin ViewModel2 la propriété 'MyDataEntity CurrentData'?
    • ou je peux lier à la propriété AllData de ViewModel1

Pouvez-vous me aider sortir?

Merci

+0

Est-ce que ViewModel2 besoin d'accéder AllData ou un seul élément spécifique? – Stephan

+0

Tout ce dont ViewModel2 devrait avoir besoin est AllData [index], qui est une instance de MyDataEntity, nécessaire pour lier avec les contrôles View2; Le truc, c'est que je dois d'une manière ou d'une autre parcourir AllData et générer/ajouter autant de contrôles View2 que de membres dans AllData IEnumerable – dvox

Répondre

1

ses sons comme vous essayez de mettre en place une vue maître/détail? Où MasterView contient le TreeView de tous les DetailViews.

Ainsi, le ViewModels ressemble à quelque chose comme

public class DataListViewModel 
{ 
    public DataDetailViewModel[] AllData {get;} 
} 

public class DataDetailViewModel 
{ 
    public Data Model {get;} 
    public DataListViewModel Parent {get;} 
} 

Si cela est plus ou moins précis, alors vous avez une route assez facile avant de vous et ce que vous devez faire est de faire un choix de vue ou ViewModel premier.

Avec le premier choix de vue, vous pouvez utiliser DataTemplate pour TreeView qui contrôlera l'élément TreeViews.

<DataTemplate x:Key="dataTemplate"> 
    <my:DataDetailView DataContext="{Binding Path=.}" /> 
</DataTemplate> 

Assurez-vous que votre View a un constructeur par défaut. Avec un premier choix ViewModel, vous devrez utiliser un TemplateSelector qui tirera la vue correcte, en fonction de l'objet en cours de définition. C'est probablement le plus flexible, car vous pouvez utiliser différentes vues basées sur la classe Detail.

Voir le lien pour plus d'informations http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselector