8
votes

Difficulté WPF Utilisation des propriétés de dépendance dans un UserControl

J'ai fait un USERCONTROL qui est destiné à être mis à jour une fois toutes les quelques secondes avec des données d'un port série. Cet usercontrol doit être très simple, consistant en une étiquette pour un nom de champ et une autre étiquette contenant la valeur de champ. Je dis que cela devrait être simple, mais cela ne fonctionne pas. Il ne met pas à jour du tout, et n'affiche même pas le nom de champ.

ci-dessous est le code: xxx

voici le xaml: < Pré> xxx

et voici le XAML de la fenêtre qui fait référence à l'UserControl. Premièrement, l'en-tête: xxx

puis l'Usercontrol lui-même: xxx

Si je savais une question plus précise à poser, Je voudrais - mais quelqu'un peut-il me dire pourquoi cela ne fonctionne pas?


0 commentaires

3 Réponses :


5
votes

Si vous souhaitez lier aux propriétés du contrôle, vous devez spécifier ainsi dans la liaison. Les liaisons sont évaluées par rapport à DataContext CODE> si leur source n'est pas spécifiée explicitement, votre reliure ne lie pas votre contrôle, mais dans le contexte hérité (qui manque probablement la propriété que vous lierez à ). Ce dont vous avez besoin est:

<Label Width="100" Height="30" Name="fieldValueLabel"
       Content="{Binding Path=fieldValue, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DAS1.LabeledField}}}" />


0 commentaires

4
votes

Vous n'avez vraiment pas besoin d'une propriété de dépendance sur votre contrôle de l'utilisateur, vous devez en fait s'efforcer de conserver les contrôles utilisateur sans rien de spécial dans le code-derrière, des contrôles personnalisés doivent être utilisés pour cela.

Vous devez définir votre Usercontrol comme ceci (sans aucun code derrière): xxx

Ensuite, assurez-vous que votre objet commercial implémente inotifypropertychangned, car vous ne pouvez pas mettre à jour de votre objet professionnel sans modifier au moins cela. beaucoup. Le nom Nom de terrain est juste un exemple de la manière dont vous pouvez lier le nom d'affichage sur l'étiquette automatiquement à une propriété de votre objet métier.

alors, il suffit de faire Assurez-vous que le DataContext de votre UserControl est votre objet commercial.

Comment cela fonctionnera-t-il? La propriété Label.Content est une dépendanceProperty et supportera la liaison elle-même. Votre objet commercial implémente inotifypropertychanged et prend donc en charge les mises à jour de la liaison - sans elle, le système de liaison ne se présente pas lorsque la valeur de votre champ change, quelles que vous sachiez si vous l'avez lié à une dépendanceProperty sur une extrémité .

Et si vous souhaitez réutiliser ce contrôle de l'utilisateur ailleurs, placez simplement une instance souhaitée de votre objet métier vers le DataContext du contrôle de marque souhaité. La liaison se connectera à partir du DataContext.


4 commentaires

J'aime ta solution parce que c'est simple. J'ai essayé de la mettre en œuvre cependant, sans succès. Le XAML pour le labeledfield a l'air exactement comme vous l'avez suggéré. Le code derrière uniquement ne contient qu'un constructeur qui appelle "initializecomonents ()", qui est la valeur par défaut. Le xaml de la fenêtre1 ressemble à ceci: "" Il me donne des erreurs qui disent "la propriété «Nom de terrain» / 'FieldValue' n'a pas été trouvé dans le type 'labeledfield' ". Plus de suggestions?


Vous devriez avoir un objet métier qui expose les propriétés "champ" et "Nom de terrain" et définissez cet objet comme DataContext de la commande Lakeedfield. Par exemple "Classe publique BusinessObject {Public String FieldnameName {Get {Retour" Texte ";}} Int Int Field {Obtenir {Retour 30;}}}" Dans le code, puis dans XAML: "


J'aime cette solution, mais cette solution n'est pas bien adaptée aux contrôles utilisateur conçus pour être réutilisés / consommés plusieurs fois dans le même U.I. Chaque instance va utiliser les mêmes liaisons que si le Dev souhaite appuyer sur différentes données à la chaîne dans chaque instance de la commande utilisateur donnée? Cette solution en théorie ne devrait pas fonctionner.


Comment vous attachez aux propriétés de contrôle des utilisateurs sans propriétés de Depemdency? Je cite l'erreur que je reçois: system.windows.markup.xamlparsexception: "une liaison" ne peut pas être définie sur la propriété "Branched" de type 'BranchFilter'. Une «liaison» ne peut être définie que sur une dépendanceProperty d'une dépendanceObject. '



9
votes

s'avère que dans le XAML pour le contrôle de l'utilisateur, la liaison a été spécifiée de manière incorrecte.

à l'origine c'était: xxx

mais je n'avais pas spécifié l'élément à quelle campagne appartient. Il devrait être (supposer que mon contrôle de l'utilisateur est nommé "LF": xxx


2 commentaires

Finalement! Passé 5 heures à comprendre les choses. Tnx!


Merci! Une solution simple était exactement ce dont j'avais besoin.