2010-08-09 6 views
0

Je ne sais pas vraiment comment résoudre mon problème. Je ne cherche pas de code complet juste aide avec dans quelle direction je devrais aller. Depuis son MVVM je ne veux pas de codebehind ... si possible ...wpf créer dynamique "cliquable"

De la db je reçois la taille de la "grille" que je devrais créer, par exemple 2x3. Maintenant je souhaite placer un "item" dans cette grille qui occupe un ou plusieurs spots.

J'essaie actuellement de le faire avec un ItemsControl qui contient une grille (je veux une grille parce que je veux utiliser ShowGridLines = "True") Mais comment créer une grille dynamique? La réflexion sur l'utilisation UniformGrid mais que l'on n'a pas ShowGridLines ...

Deuxième problème (depuis que je suis un noob MVVM) est la sélection d'une place dans la grille. Celui sur lequel vous cliquez ne sera pas un problème. Le problème est que l'objet que vous essayez de placer occupe deux points. Comment puis-je savoir quel est l'endroit à côté de celui sur lequel je clique?

Toute aide est appréciée

Répondre

2

Puisque vous ne pouvez pas facilement lier les définitions ligne/colonne d'une grille , je vous suggère de construire un simple contrôle personnalisé qui hérite directement de Grille.

Voici mon approche avec 3 propriétés de dépendance supplémentaires:

  • int MyColumnCount
  • int MyRowCount
  • ObservableCollection MyChilds

le MyColumnCount/MyRowCount sera lié aux propriétés du ViewModel , que vous mettez à jour, lorsque vous obtenez les nouvelles valeurs de la base de données. Le ViewModel fournira également une collection de FrameworkElements, qui seront les éléments de la grille et liés à MyChilds.

Vous pouvez créer de nouveaux contrôles dans ViewModel et utiliser la propriété jointe de la grille pour définir la position. Par exemple:

TextBlock b = new TextBlock() { Text = "Hello World!" }; 
Grid.SetRow(b, <your position>); 
Grid.SetColumn(b, <your position>); 
Grid.SetColumnSpan(b, <your column span>); 
MyChilds.Add(b); 

Dans les PropertyChangedCallbacks des nouvelles propriétés int, vous modifiez les définitions ligne/colonne, selon les nouvelles valeurs. Le rappel de la propriété de collection enregistre un événement de collection modifié sur la nouvelle ObservableCollection et ajoute les nouveaux éléments aux enfants de la Grille, lors de la modification des événements.

Tout ce dont vous avez besoin pour les changements de réseau dynamiques. Pour votre deuxième question: C'est assez facile. Dans le cas où vous attrapez, vous obtiendrez l'expéditeur de l'élément cliqué dans la grille. L'expéditeur est principalement le contrôle cliqué directement. Vous pouvez utiliser les fonctions de la grille statique à nouveau, pour calculer la position:

Grid.GetRow(item); 
Grid.GetColumn(item); 
Grid.GetColumnSpan(item); 

Avec le nombre total de lignes/colonnes de la grille (Mon ... Count) vous pouvez calculer les positions voisines.

Jan

+0

hmm semble intéressant je vais essayer votre approche. J'espérais passer la création d'un contrôle personnalisé mais ... – debe

+0

@debe ça marche ou pas? – Omarj