12
votes

Afficher de manière dynamique un contrôle en fonction de la propriété liée à l'aide de WPF

J'ai une propriété qui est un type de données de base de données ( char , datetime , int , float etc ...) et je veux changer le contrôle utilisé pour entrer une valeur du type sélectionné. Donc, pour les valeurs de texte, je veux un textbox datePicker .

Une façon dont j'ai pensé à faire de la part de chaque contrôle de mon former et définir leur visibilité à l'aide d'un IVALUECONVERTER de . Je sais que cela fonctionnera, mais cela créerait beaucoup de code et ne se sent pas très gentil.

L'autre façon, je pensais utiliser un contentpresenter et définir son contenu. avec un style et DataTriggers mais je ne peux pas le faire fonctionner. xxx

si quelqu'un peut remplir mon "???" ou offre une meilleure solution s'il vous plaît faire.


0 commentaires

3 Réponses :


0
votes

Je regarderais dans les datatempates. Par exemple: xxx


1 commentaires

Je ne suis pas sûr que cela fonctionnerait pour moi car je n'utilise pas de "type" réel pour faire mon choix de contrôle, j'utilise une valeur d'énumération exposée comme une propriété sur ma viewModel.



13
votes

Vous pouvez faire une combinaison de style avec des setters et des datatempates. Vous avez essentiellement le début de votre code dans votre code, bien que je ne pense pas contentpresenter est le bon contrôle au style, car il n'a pas de modèle.

Créer un style comme celui-ci: xxx

puis utilisez le style dans le contentControl : xxx


3 commentaires

Je ne suis pas sûr de pouvoir partager mon code car il y a beaucoup de dépendances. En fait, mon problème réel est un peu plus compliqué que ce que j'ai laissé. Je suis à peu près sûr que votre solution fonctionnera pour moi, je viens de recevoir un problème où j'essaie de définir le contenu du contenuControl sur {Binding} plutôt que {myvalue de la liaison}, ce qui signifie que WPF charge la vue de ma viewModel dans le contrôle de contenu et continue de continuer à aller ...


Ah, je vois. Avez-vous essayé {chemin de liaison =.}?


Trié! Je devais régler le DateType de la au type de visitel. Je suppose que cela crée une liaison localement scopée entre le type de viewmodel et la vue que je veux afficher. Merci encore!!



11
votes

tandis que la solution style pourrait fonctionner, la manière appropriée pour mettre en œuvre le comportement de contenu dynamique serait d'utiliser des datatempates comme Section suggérée. Cependant, vous utiliseriez une énumération pour déterminer quel type de données à utiliser, ce qui signifie essentiellement que vous souhaitez mapper un seul type sur plusieurs dataMates de données. Ce problème est résolu par la classe dataMplateselector , la description suivante est directement de MSDN:

"En règle générale, vous créez un type de dataMPATEST lorsque vous avez plusieurs types de données pour le même type d'objets et que vous souhaitez fournir votre propre logique pour choisir un fichier de données à appliquer en fonction des propriétés de chaque objet de données."

Votre contenu dynamique doit être hébergé par un contentControl comme ceci: xxx

la mise en œuvre de myTemplateselector : xxx

puis comme vous l'attendez, voici les données de données à choisir de: xxx

avec ceci, Le DATATEMPATE sera choisi sur la base de la propriété DataType de votre modèle de vue. Ce qui est à mon avis, beaucoup plus propre que d'utiliser la visibilité ou styles.


0 commentaires