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 :

UserControl dans DataTemplate & Binding


Sujet :

Windows Presentation Foundation

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut UserControl dans DataTemplate & Binding
    Bonjour,
    j'ai une fenêtre dont le DataContext est défini sur un objet X.
    Dans cette fenêtre, j'ai un UserControl auquel je ne peux accéder directement, car situé dans un DataTemplate. Dans mon UserControl, j'ai créé une DP Source, bindée à X.Maprop.

    Lors du clic sur un bouton de ma fenêtre, j'effectue des traitements en modifiant directement l'objet X, passé par référence.
    Ces traitements modifient entre autres X.Maprop, à laquelle est bindée mon UC, et lorsque c'est fait, je souhaite exécuter du code dans mon UserControl.
    Je l'ai placé dans l'évènement SourceUpdated, mais il n'est pas appelé lors de la modification de la propriété...
    Pourquoi ?

  2. #2
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    Pourrais tu nous mettre un peu de code?
    "Le train de tes injures roule sur le rail de mon indifférence."

    "Monde de merde !!"

    Georges Abitbol.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut
    Voici le code, épuré pour ne laisser que l'essentiel:
    le UserControl est placé dans cette fenêtre:
    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <Window>
        <Grid>
            <ContentControl>
                <ContentControl.Resources>
                    <DataTemplate DataType={x:Type local:Movie}>
                        <StackPanel>
                            <local:UcGenres Source={Binding Genres, Mode=TwoWay} SourceUpdated="UcGenres_SourceUpdated" />
                        </StackPanel>
                    </DataTemplate>
                </ContentControl.Resources>
            </ContentControl>
        </Grid>
    </Window>

    La propriété Source que j'ai créée:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static readonly DependencyProperty SourceProperty = DependencyProperty.Register("Source", typeof(List<Genre>), typeof(UCGenres), new PropertyMetadata(default(List<Genre>)));
     
    public List<Genre> Source { get; set; }

    Le code de UcGenres ne contient rien d'autre, hormis la définition de son DataContext dans le Loaded (tout ceci fonctionne, il affiche bien ce qu'il doit afficher) et le code de test que j'avais mis dans l'évènement UcGenresSourceUpdated (juste une ligne de Debug.WriteLine(""); pour pouvoir y placer un point d'arrêt).

    Voilà, lors du clic sur un bouton de la fenêtre, les traitements que j'ai définis s'exécutent. Avant ces traitements, la propriété Genres est null et prend donc la valeur par défaut, soit une List<Genre> vide ; après, elle contient les genres voulus. Pourtant l'évènement UcGenresSourceUpdated n'est pas appelé.

  4. #4
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    Ce ne serais tout simplement pas le chemin de ton événement d'update qu'il faut que tu place en relatif, là il est bindé sur ton context.
    "Le train de tes injures roule sur le rail de mon indifférence."

    "Monde de merde !!"

    Georges Abitbol.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut
    Exact ! Je me suis mélangé les pinceaux avec ma propriété que j'ai appelée Source et le SourceUpdated à côté. Ici c'est quand la source du binding est mise à jour que l'évènement est appelé (hors elle n'est jamais mise à jour ; je la définis une fois pour toute au Loaded de l'UC).
    C'est donc quand ma propriété personnalisée Source est mise à jour que je veux pouvoir exécuter mon code.
    Mais là, je ne vois pas du tout où placer mon code...

  6. #6
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    tu peux faire un truc comme ça :
    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
            public ObservableCollection<string> MyProperty
            {
                get { return (ObservableCollection<string>)GetValue(MyPropertyProperty); }
                set { SetValue(MyPropertyProperty, value); }
            }
     
     
     
            public static readonly DependencyProperty MyPropertyProperty =
                DependencyProperty.Register("MyProperty", typeof(ObservableCollection<string>), typeof(MyControl), new PropertyMetadata(null, MyPropertiyChanged));
     
            private static void MyPropertiyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                var me = d as MyControl;
                if (d == null) return;
                if (e.Property == MyPropertyProperty) me.WhenIchanged((e.NewValue as ObservableCollection<string>));
            }
     
            private void WhenIchanged(ObservableCollection<string> observableCollection)
            { 
              observableCollection.CollectionChanged+=(e,s)=>EvenementUpdated();
              EvenementUpdated();
            }
     
            private object EvenementUpdated()
            {
               // "Mon vent est update"
            }
    Tu remarquera que je passe par une ObservableCollection, qui permet de rafraichir automatiquement la source lors de l'ajout d'une entité, mais aussi de s'accrocher à l'event d'ajout.
    Mais le mieux pour moi est de pouvoir s'affranchir de toute opération dans le contrôle si je peux passer par le modèle.
    "Le train de tes injures roule sur le rail de mon indifférence."

    "Monde de merde !!"

    Georges Abitbol.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut
    OK. Merci ça marche nickel !

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

Discussions similaires

  1. [Débutant] Binding d'un UserControl dans RowDetailsTemplate
    Par Tarteens dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 16/10/2013, 10h40
  2. Bind variable incluse dans une autre bind variable
    Par kinder_pingui dans le forum SQL
    Réponses: 3
    Dernier message: 28/11/2006, 10h35
  3. [C# 1.1] - UserControl dans Internet Explorer
    Par Erakis dans le forum Windows Forms
    Réponses: 1
    Dernier message: 01/08/2006, 21h10
  4. [C#] Usercontrol dans usercontrol -> pb compilation
    Par annalady dans le forum Windows Forms
    Réponses: 1
    Dernier message: 11/04/2006, 15h38
  5. [VB.NET]Afficher plusieurs UserControls dans un Panel
    Par Golzinne dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/02/2006, 21h29

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