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 :

MarkupExtension encapsulant un binding


Sujet :

Windows Presentation Foundation

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut MarkupExtension encapsulant un binding
    Bonjour,

    Je cherche à faire mon propre MarkupExtension afin de binder une property et de renvoyer une ressource correspondant à la valeur de la propriété.

    J'ai donc créer la classe ResourceKeyBindingExtension qui hérite de MarkupExtension et j'encapsule un Binding (l'heritage directe de Binding n'est pas possible car la fonction ProvideValue est sealed)
    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
    23
     
    public class ResourceKeyBindingExtension : MarkupExtension
    {
    	private Binding resourceKeyBinding;
     
    	public ResourceKeyBindingExtension()
    	{
    		resourceKeyBinding = new Binding();
    	}
     
    	public PropertyPath Path
    	{
    		get { return resourceKeyBinding.Path; }
    		set { resourceKeyBinding.Path = value; }
    	}
     
    	.....
     
    	public override object ProvideValue(IServiceProvider serviceProvider)
    	{
    		....
    	}
    }
    dans la fonction ProvideValue, je récupère le DataContext de l'objet cible de mon marqueur pour l'utiliser en tant que source de mon binding et je tente de récupérer la valeur et d'obtenir la ressource associée :
    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
     
    	IProvideValueTarget target = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
    	if(target != null)
    	{
    		FrameworkElement targetElement = target.TargetObject as FrameworkElement;
    		if(targetElement != null)
    			resourceKeyBinding.Source = targetElement.DataContext;
    	}
     
    	if(resourceKeyBinding.Source != null)
    	{
    		StaticResourceExtension resource = new StaticResourceExtension();
    		resource.ResourceKey = resourceKeyBinding.ProvideValue(serviceProvider);
    		return resource.ProvideValue(serviceProvider);
    	}
    	else
    		return "";
    Ensuite,J'utilise ResourceKeyBindingExtension directement dans un usercontrol
    Code xml : 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
     
    <UserControl x:Class="MyApp.MyControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    	xmlns:my="clr-namespace:MyApp">
    	<UserControl.Resources>
    		<ResourceDictionary>
    			<ResourceDictionary.MergedDictionaries>
    				<ResourceDictionary Source="Resources/ResourceDictionary.xaml" />
    			</ResourceDictionary.MergedDictionaries>
     
    		</ResourceDictionary>
    	</UserControl.Resources>
    	<UserControl.Content>
    		<my:ResourceKeyBindingExtension Path="Name"  />	
    	</UserControl.Content >
    </UserControl>
    Je passe bien dans la fonction ProvideValue mais lorsque le DataContext de mon UserControl n'est pas encore définit. Lorsque je définit le DataContext je ne repasse pas dans ProvideValue.

    Avez vous une idée pour résoudre mon problème?

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Pourquoi ne pas dériver de la classe Binding comme le fait Thomas dans son excellent tuto sur les markup extensions ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    Parce que j'ai besoin de redéfinir la méthode ProvideValue et que cette methode est sealed sur la classe Binding et sur la classe BindingBase également.

  4. #4
    Membre éprouvé Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Points : 998
    Points
    998
    Par défaut
    Coucou,

    Tu peux t'abonner à l'événement FrameworkElement.DataContextChanged pour savoir quand le DataContext change... Je pense que cela fera l'affaire !

    Bon courage,
    Jonathan ANTOINE - Découvrez mon livre: MVVM, de la découverte à la maîtrise.

    Microsoft MVP Client Application Development
    - MCPD Windows 4.0, etc.
    Mon blog : http://www.jonathanantoine.com

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    Oui, c'est ce que j'ai fait.

    Mais maintenant je cherche à appeler la fonction ProvideValue dans l'évènement DataContextChanged.
    Mais je ne sais pas comment créer le paramètre de type IServiceProvider.

    As tu une idée?

  6. #6
    Membre éprouvé Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Points : 998
    Points
    998
    Par défaut
    Citation Envoyé par Troopers Voir le message
    Oui, c'est ce que j'ai fait.
    Mais je ne sais pas comment créer le paramètre de type IServiceProvider.

    Tu peux peut être le stocker lors du premier appel à ProvideValue
    Jonathan ANTOINE - Découvrez mon livre: MVVM, de la découverte à la maîtrise.

    Microsoft MVP Client Application Development
    - MCPD Windows 4.0, etc.
    Mon blog : http://www.jonathanantoine.com

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    J'y ai pensé, mais les propriétés sont réinitialisées à null entre l'appel de ProvideValue et l'appel de DataContextChanged. Et je ne sais pas par qui et pourquoi....


    Pour ceux que ça intéresse, un article intéressant pour faire un markup extension qui bind une clef de resource
    http://www.e-pedro.com/2009/06/using...ources-in-wpf/
    c'est ce que j'ai utilisé, après mettre arraché les cheveux pour encapsuler un binding

  8. #8
    Membre éprouvé Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Points : 998
    Points
    998
    Par défaut
    Article très intéressant !
    Jonathan ANTOINE - Découvrez mon livre: MVVM, de la découverte à la maîtrise.

    Microsoft MVP Client Application Development
    - MCPD Windows 4.0, etc.
    Mon blog : http://www.jonathanantoine.com

Discussions similaires

  1. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  2. []Erreur sur second emploi collection binding
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/03/2004, 18h02
  3. Bind - sous-domaine
    Par _Gabriel_ dans le forum Réseau
    Réponses: 4
    Dernier message: 07/03/2004, 11h54
  4. Encapsulation graphique d'un outil en ligne de commande
    Par Leishmaniose dans le forum Composants VCL
    Réponses: 3
    Dernier message: 12/11/2003, 11h59
  5. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 14h58

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