IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Binding d'une dependency property vers une autre


Sujet :

Windows Presentation Foundation

  1. #1
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut Binding d'une dependency property vers une autre
    Bonjour,

    si un control en contient un autre est-il possible de binder une propriété du premier vers une dependency property du deuxième ?

    Voici une illustration :
    un control "ControlTest" contient un autre control "InnerControlTest".
    "InnerControlTest" affiche une valeur "InnerValue" en l'entourant d"une bordure bleue.
    "ControlTest" quant à lui affiche une valeur "Value" en l'encapsulant dans un "InnerControlTest" et en entourant le tout d'une bordure verte.

    L'objectif est que la valeur à afficher soit passée par l'utilisateur à "ControlTest" via la dependency property "Value", puis que "ControlTest" la transmette à "InnerControlTest" via la dependency property "InnerValue".

    La valeur passe bien à "ControlTest" via "Value" comme le confirme le "Label" contenu dans "ControlTest".
    En revanche la valeur n'est pas transmise à "InnerControlTest" comme le montre le "Label" contenu dans "InnerControlTest", qui contient la valeur par défaut d'un "int" : 0.

    En pièce jointe se trouve un projet VS 2008 qui illustre le problème.


    Merci.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éprouvé Avatar de Thrud
    Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    Bonjour,

    si tu mets ça dans le ControlTest.xaml, ça marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <UserControl x:Class="TestCustomControl.ControlTest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestCustomControl"
    x:Name="TheControl">
    <Border BorderBrush="Green" BorderThickness="2">
    <Grid>
    <Grid.RowDefinitions>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    
    <Label x:Name="CTLabel" Content="{Binding Value}" Grid.Row="0"/>
    <local:InnerControlTest x:Name="CTInnerCT" InnerValue="{Binding Value, ElementName=TheControl}" Grid.Row="1"/>
    </Grid>
    </Border>
    </UserControl>
    
    J'ai nommé le UserControl, et changé la source dans le InnerControlTest. Il ne trouve pas la propriété Value sinon quand tu fais le Binding, parce qu'il se réfère à l'objet dans le DataContext, et tu as mis un this.DataContext = this; dans le InnerControlTest.

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Tout simplement parfait, merci beaucoup.

    En fait je pensais que dans le "contexte XAML" "ControlTest.xaml" le "DataContext" serait partout celui de "ControlTest".

    Du coup ça casse un peu la cohérence puisque le binding "{Binding Value}" n'a pas le même sens pour le "Label" au dessus.
    De plus c'est moins élégant syntaxiquement car obligeant à référencer explicitement le "ControlTest".

    Quelle est la raison de ce choix ?

  4. #4
    Membre éprouvé Avatar de Thrud
    Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    ben... je crois que ça casse la cohérence parce que dans ton contrôle, tu réaffectes le DataContext.
    La notation différente vient juste de la façon dont ton UserControl est designé, c'est toi qui force ce 'choix'

  5. #5
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Oui en effet c'est le problème.

    Et donc une bonne pratique serait de toujours indiquer explicitement le "DataContext", par exemple via "ElementName" ?

    En effet, dans le cas contraire où le "DataContext" est implicite, si un sous-control le remplace par un autre, comme c'était le cas ici, le binding ne fonctionne plus comme attendu.

  6. #6
    Membre éprouvé Avatar de Thrud
    Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    Oula ! Loin de moi l'idée de dire que c'est une 'bonne pratique'. Faut demander aux MVP pour ce genre de trucs.

    D'usage, je ne surcharge pas le DataContext dans mes UserControl. Mais j'ai pas trouvé de solution élégante.

  7. #7
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Oula ! Loin de moi l'idée de dire que c'est une 'bonne pratique'. Faut demander aux MVP pour ce genre de trucs.
    Dans ce cas attendons l'avis de Thomas

  8. #8
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    On parle de moi ?

    Citation Envoyé par seriousme Voir le message
    Et donc une bonne pratique serait de toujours indiquer explicitement le "DataContext", par exemple via "ElementName" ?
    Affecter le DataContext est une bonne pratique pour faire du binding. Après, que tu le fasses par ElementName, Source, etc.. peut importe

  9. #9
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Affecter le DataContext est une bonne pratique pour faire du binding. Après, que tu le fasses par ElementName, Source, etc.. peut importe
    Ok, merci.

    Plus généralement en développement il faut éviter de reposer sur des règles implicites même si elles permettent d'alléger le code.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/08/2010, 14h02
  2. Modification d'une Dependency Property dans une autre DP
    Par PPierre59 dans le forum Silverlight
    Réponses: 3
    Dernier message: 02/01/2010, 20h29
  3. Réponses: 0
    Dernier message: 07/06/2009, 12h31
  4. Réponses: 5
    Dernier message: 22/05/2008, 14h42
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo