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 :

[WPF] Probléme de binding dans un UserControl :(


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut [WPF] Probléme de binding dans un UserControl :(
    Bonjour à tous,


    Je souhaite créer un composant qui soit un menu, et dans ce menu j'ai des items qui contiennent comme valeurs un champ text, ainsi que le nom d'une classe qui sera chargé dans une frame

    J'ai créé un UserControl qui fera office de l'item dans le menu et qui contient 1 TextBox ainsi qu'une propriéte Text

    XAML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <UserControl x:Class="WPF_Test1.MonUserControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WPF_Test1"
                 >
      <StackPanel>
        <TextBox x:Name="MaTextBox" />
      </StackPanel>
    </UserControl>
    C#
    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
     
        public partial class MonUserControl : System.Windows.Controls.UserControl
        {
            private string mText;
            public string Text
            {
                get { return this.mText; }
                set { this.mText = value; this.MaTextBox.Text = this.mText; }
            }
     
            public MonUserControl()
            {
                InitializeComponent();
            }
     
        }
    dans ma fenetre principale j'ai une liste box qui elle fait office de menu et contien mes Items de type MonUserControl via un Template

    XAML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      <Window.Resources>
        <DataTemplate x:Key="MenuItemTemplate" DataType="x:Type MonMenuItem">
          <Grid>
            <local:MonUserControl Text="{Binding Path=TextProperty}" />
          </Grid>
        </DataTemplate>
      </Window.Resources>
     
      <Grid x:Name="mainGrid">
        <ListBox ItemsSource="{Binding}" ItemTemplate="{StaticResource MenuItemTemplate}" x:Name="Liste" />
      </Grid>
    enfin la class qui est chargé dans mon listbox se présente de la facon suivante :

    C#
    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
     
        class MonMenuItem: DependencyObject
        {
            public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(TilMenuItem));
     
            public MonMenuItem(string inText)
            {
                SetValue(TextProperty, inText);
            }
     
            // Label du lien
            public string Text
            {
                get { return (string)GetValue(TextProperty); }
                set { SetValue(TextProperty, value); }
            }
        }
     
        class MonMenu: ObservableCollection<MonMenuItem>
        {
            public MonMenu() { }
        }
    Seulement voila, j'ai l'erreur suivante au chargement des données dans la ListBox

    Impossible de définir « Binding » sur la propriété « Text » de type « MonUserControl ». Un « Binding » peut uniquement être défini sur un DependencyProperty d’un DependencyObject.

    Comment définir MonUserControl pour qu'il puisse accepter le Binding ?

    merci d'avance pour votre aide
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  2. #2
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    Alors pour ceux qui sont intéressé par la réponse voila un petit lien sympa
    http://decav.com/blogs/andre/archive...or-window.aspx

    Par rapport au code précédent on obtient ceci

    Pour MonUserControl

    XAML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <UserControl x:Class="WPF_Test1.MonUserControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WPF_Test1"
        x:Name="MonUserControl_xaml"
                 >
      <StackPanel>
        <TextBox x:Name="MaTextBox" Text={Binding  ElementName=MonUserControl_xaml, Path=Text} />
      </StackPanel>
    </UserControl>
    C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        public partial class MonUserControl : System.Windows.Controls.UserControl
        {
            public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MonUserControl ));
     
     
            public MonUserControl()
            {
                InitializeComponent();
            }
     
        }
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  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
    Tu peux faire un tout petit peu plus simple (plus rapide à écrire en tous cas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <UserControl x:Class="WPF_Test1.MonUserControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WPF_Test1"
                 >
      <StackPanel>
        <TextBox x:Name="MaTextBox" Text={Binding Text} />
      </StackPanel>
    </UserControl>
    En principe, le DataContext par défaut est ton UserControl il me semble... donc pas la peine de le préciser

  4. #4
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    Je viens de tester ta solution et malheureusement ça ne fonctionne pas car il ne détecte pas automatiquement le context donc il faut bien préciser le ElementName dans le Binding
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  5. #5
    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
    Oki... je maitrise pas encore très bien WPF en fait

  6. #6
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    Moi non plus je suis en phase d'apprentissage mais ca vient tout doucement !
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  7. #7
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Points : 134
    Points
    134
    Par défaut
    Justement, le code le plus simple est un mélange des deux, faire des bindings courts comme proposés par tomlev et lacher un DataContext="..." dans l'élément de plus haut niveau du content du controle, cela évite de préciser chaque fois l'ElementName

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/06/2009, 21h41
  2. [WPF] Problème de binding
    Par tomlev dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 04/02/2008, 14h08
  3. [WPF] Problème de menu dans fenetre transparente
    Par Zucher dans le forum Framework .NET
    Réponses: 3
    Dernier message: 30/01/2008, 22h28
  4. [WPF] Problème de binding entre une SortedList et une ListBox
    Par JuTs dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 10/12/2007, 13h20
  5. [WPF] Problème de binding
    Par JuTs dans le forum Framework .NET
    Réponses: 42
    Dernier message: 06/11/2007, 11h28

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