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 :

[Markups] Probleme de converter


Sujet :

Windows Presentation Foundation

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut [Markups] Probleme de converter
    bonjour
    j'ai trouvé du code pour un staticresource avec un converter
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     public class StaticResourceBinding : StaticResourceExtension
        {
            public StaticResourceBinding() { }
     
            public StaticResourceBinding(string resourceKey)
            : base(resourceKey)
            { }
     
            public IValueConverter Converter { get; set; }
            public object ConverterParameter { get; set; }
            public CultureInfo ConverterCulture { get; set; }
            public string StringFormat { get; set; }
     
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                var staticResourceValue = base.ProvideValue(serviceProvider);
     
                if (Converter == null)
                    return (StringFormat != null)
                        ? string.Format(StringFormat, staticResourceValue)
                        : staticResourceValue;
     
                var targetInfo = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
                var targetFrameworkElement = (FrameworkElement)targetInfo.TargetObject;
                var targetDependencyProperty = (DependencyProperty)targetInfo.TargetProperty;
     
                var convertedValue = Converter.Convert(staticResourceValue, targetDependencyProperty.PropertyType, ConverterParameter, ConverterCulture);
     
                return (StringFormat != null)
                    ? string.Format(StringFormat, convertedValue)
                    : convertedValue;
            }
        }
    toutefois quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Text="{local:StaticResourceBinding BT_CANCEL, Converter={StaticResource uc}}"
    j'ai l'erreur suivante de compilation
    Gravité Code Description Projet Fichier Ligne État de la suppression
    Erreur Erreur de build inconnue, 'MC3045*: propriété 'Converter' inconnue pour le type 'MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension' rencontrée lors de l'analyse d'une expression Markup Extension. Ligne 38 Position 20.' DynamicResource converter

    j'aimerais savoir si vous auriez une idée de la raison pour laquelle je peux avoir cette erreur ....
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut [Markups] avec converter (version simple)
    re-
    pour simplifier mon problème je tente de faire la chose suivante c'est de passer un converter a un markup que j'ai crée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [MarkupExtensionReturnType(typeof(object))]
        public class PersoMarkup : MarkupExtension
        {
            public PersoMarkup() { }
            public object Converter { get; set; }
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                return "alpha";
            }
        }
    quand je fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Text="{local:PersoMarkup Converter={StaticResource uc}}"
    j'ai toujours l'erreur suivante
    Erreur de build inconnue, 'MC3045*: propriété 'Converter' inconnue pour le type 'MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension' rencontrée lors de l'analyse d'une expression Markup
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    le type 'MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension'
    Apparemment il reconnait pas ton PersoMarkup comme une markup extension... Tu as bien défini le namespace local?

    Et essaie de renommer la classe en PersoMarkupExtension; la convention pour les markup extensions est de les nommer TotoExtension, et d'omettre le suffixe "Extension" lors de l'utilisation :


  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    en fait ca change rien
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     [MarkupExtensionReturnType(typeof(object))]
        public class PersoMarkupExtension : MarkupExtension
        {
            public PersoMarkupExtension() { }
            [DefaultValue(null)]
            public object Converter { get; set; }
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                return "alpha";
            }
        }
    ceci passe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     <TextBlock Margin="10,0,0,0"
                       Background="Aquamarine"
                       TextWrapping="Wrap"
                       Text="{local:PersoMarkup}"
                       VerticalAlignment="Top"
                       Height="24" />
    par contre avec cela : ca passe plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <TextBlock Margin="10,0,0,0"
                       Background="Aquamarine"
                       TextWrapping="Wrap"
                       Text="{local:PersoMarkup Converter={StaticResource uc}}"
                       VerticalAlignment="Top"
                       Height="24" />
    bref quand tu rajoute le converter il y a toujours l'erreur :
    Erreur de build inconnue, 'MC3045*: propriété 'Converter' inconnue pour le type 'MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension' rencontrée lors de l'analyse d'une expression Markup Extension.

    nota si tu met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <TextBlock Margin="10,0,0,0"
                       Background="Aquamarine"
                       TextWrapping="Wrap"
                       Text="{local:PersoMarkup Converter=12}"
                       VerticalAlignment="Top"
                       Height="24" />
    ca passe .....
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Je n'ai pas bien compris le but de ce MarkupExpression
    Tu veux convertir la Key (un string) du StaticResource ou (du DynamicResource) en chaine majuscule en utilisant un Converter dedie associe à ton MarkupExtension ou bien j'ai mal compris alors...

    En tout cas ton MarkupExtension doit etre :
    - decore avec le TypeConverter utilise (UC) pour qu'il puisse l'accepter...
    - il est possible de transmettre un 2eme parameter de type Binding(markup Binding) pour pouvoir utilizer ton converter uc

    Mais avant d'aller plus loin ,j'aimerais avoir la reponse à ma petite question...

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    en fait j'aimerais améliorer le markup dynamicresource
    en lui adjoignant un converter ....

    meme s'il existe des solutions alternatives pour le fun et l'exercice ca serait sympa a utiliser
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Tu peut mettre la fonctionalite que tu veux dans les parametes ...
    Le Parser xaml attend des chaines qu'il convertit en type standard en deferant à ses converters de Binding ...

    Via le Markup Binding il fait une conversion soit en type WPF (controls et autres class WPF) soit en type .Net Framework (datas )...
    S'il ne trouve pas de type ,il renvoie la chaine entrée ...
    Le converter est transparent pour nous

    De plus un MarkupExtension accepte gracieusement toute Prop Bindee via Binding entre Acccolades y compris un Converter !!!
    Il suffit ensuite d'invoquer le custom Converter via Binding.Converter avec les eventuels parametres transmis ...


    bref :
    code .cs du converter1:
    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
    24
    25
     
    [ValueConversion(typeof(string), typeof(String))]
            public class UC1: IValueConverter
            {
                private string keyvalue;
                public UC1()
                {}
                public UC1(string key)
                {
                    this.keyvalue = key;
                }
     
                public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
                {
     
                    return keyvalue.ToUpper();
                }
     
     
     
                public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
                {
                    throw new NotImplementedException();
                }
            }
    code .cs de PersoMarkupExtension1:

    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
     
     [MarkupExtensionReturnType(typeof(object))]
        [TypeConverter(typeof(UC1))]
        public class PersoMarkupExtension1 : MarkupExtension
        {
     
            public object Key { get; set; }
            public Binding BindingValue { get; set; }
            public PersoMarkupExtension1() { }
            public PersoMarkupExtension1(string key, Binding bd) 
            {
                this.Key = key;
                this.BindingValue = bd;
            }
     
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                this.BindingValue.Converter = new UC1(this.Key as string );
                return this.BindingValue.ProvideValue(serviceProvider);
     
            }
        }
    code xaml du usercontrol1 utilisateur:

    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
    24
    25
    26
    27
    28
     
     
    <UserControl x:Class="WpfExtension.UserControl1"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:WpfExtension" 
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
        <UserControl.Resources>
            <!--class data quelconque-->
            <local:MyData 
                x:Key="data"
                ID="0"
                 Name="ali">
     
            </local:MyData>
        </UserControl.Resources>
        <Grid DataContext="{Binding Source={StaticResource data}}">
            <TextBlock 
                Text="{local:PersoMarkupExtension1 Key=uc, BindingValue={Binding ID}}"
                >
     
            </TextBlock>
     
        </Grid>
    </UserControl>


    code .cs de PersoMarkupExtension1:

    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
     
    [MarkupExtensionReturnType(typeof(object))]
        [TypeConverter(typeof(UC2 ))]
        public class PersoMarkup2 : MarkupExtension
        {
     
            public Binding BindingValue { get; set; }
            public PersoMarkup2() { }
            public PersoMarkup2( Binding bd)
            {
                this.BindingValue = bd;
            }
     
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                Type t = this.BindingValue.Converter.GetType();
                this.BindingValue.Converter = new UC1(t.Name );
     
                return this.BindingValue.ProvideValue(serviceProvider);
     
            }
        }
    code xaml du usercontrol2 utilisateur:

    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
    24
    25
    26
    27
    28
    29
    30
     
    <UserControl x:Class="WpfExtension.UserControl2"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:WpfExtension" 
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
        <UserControl.Resources>
            <local:MyData 
                x:Key="data"
                ID="0"
                 Name="ali">
     
            </local:MyData>
            <local:UC1 x:Key="uc"/>
        </UserControl.Resources>
        <Grid 
     
            x:Name="grid"
            DataContext="{Binding Source={StaticResource uc}}">
            <TextBlock 
                Text="{local:PersoMarkup2  BindingValue={Binding Converter={StaticResource uc}}}"            
                >
     
            </TextBlock>
     
        </Grid>
    </UserControl>
    code xaml du form utilisant usercontrol2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    <Window x:Class="WpfExtension.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:local="clr-namespace:WpfExtension" 
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <StackPanel x:Name="pnl">
            <Button Content="{Binding Source=haha}"/>
            <local:UserControl2></local:UserControl2>
        </StackPanel>
    </Window>
    bon code...

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    ce que tu m'explique c'est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Text="{local:StaticResourceBinding BT_CANCEL, Converter={StaticResource uc}}"
    c'est pas possible naturellement ?

    ceci etant j'ai trouvé ca http://www.hardcodet.net/2008/04/wpf...-binding-class

    chapite : Problem: Attribute syntax with resources
    avec -> You cannot nest static or dynamic resources within a custom markup extension due to a framework bug....
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  9. #9
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    Re

    Si tu tiens absolument à cette syntaxe ,la reponse est fournie ici par 2 gourous de Microsoft :

    1er lien:
    intitule :Simplify your Binding Converter with a Custom Markup Extension by Walt Ritscher
    http://www.google.fr/url?sa=t&rct=j&...21658157,d.ZGg

    2eme lien:
    l'inconnu DR WPF
    Tips and Tricks: Making Value Converters More Accessible

    http://www.google.fr/url?sa=t&rct=j&...21658157,d.ZGg

    bon code.....

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    oui j'avais vu cette solution
    mais ça répondait pas vraiment a mon attente

    le coté markup redéfini avec ses propres convertisseurs je trouvais ça plus sympa (plus sexy)
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

Discussions similaires

  1. Probleme De Convertion
    Par Boutellis dans le forum Forms
    Réponses: 0
    Dernier message: 11/06/2009, 10h32
  2. probleme de convertion
    Par srabounet dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2009, 14h39
  3. probleme de convertion date
    Par morando dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 18/03/2009, 00h32
  4. Probleme avec Converter
    Par tomy29 dans le forum JSF
    Réponses: 3
    Dernier message: 22/07/2008, 20h43
  5. probleme de convertion Bits en Float
    Par L4BiN dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 15/09/2007, 20h52

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