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 sur une dependencyproperty


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 95
    Par défaut Binding sur une dependencyproperty
    Bonjour,

    J'ai un UserControl personnalisé dans lequel j'ai un Label et une ComboBox.
    Sur l'évènement Loaded de l'UC, je charge une liste d'objet <T> et la défini comme ItemsSource de ma ComboBox.
    Mon UserControl défini une DependencyProperty de type T

    Ma fenêtre principal qui implémente l'UserControl possède une propriété de type T et j'aimerais faire un binding de cette propriété sur la DependencyProeprty de mon UserControl.

    Je vous joins mon code :

    XAML de l'UserControl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <UserControl x:Class="WpfApplication3.UserControls.UserControl1"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="29" d:DesignWidth="316"
                 Loaded="UserControl_Loaded">
        <Grid>
            <Label Content="{Binding Path=Code}" Height="30" HorizontalAlignment="Left" Name="label1" VerticalAlignment="Top" Width="72" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" />
            <ComboBox Height="30" HorizontalAlignment="Left" Margin="78,0,0,0" Name="comboBox1" VerticalAlignment="Top" Width="158" DisplayMemberPath="Libelle" SelectedValuePath="Id" />
        </Grid>
    </UserControl>
    Code Behind de l'UserControl :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    public partial class UserControl1 : UserControl
        {
     
     
            private List<RegroupementViewModel> regroupements;
            public static readonly DependencyProperty RegroupementProperty = 
                DependencyProperty.Register("Regroupement", typeof(RegroupementViewModel), typeof(UserControl1));
            public RegroupementViewModel Regroupement
            {
                get
                {
                    return (RegroupementViewModel)GetValue(RegroupementProperty);
                }
                set
                {
                    SetValue(RegroupementProperty, value);
                }
            }
            public UserControl1()
            {
                InitializeComponent();
     
                regroupements = new List<RegroupementViewModel>();
                comboBox1.ItemsSource = regroupements;
                DataContext = Regroupement;
            }
     
            private void LoadRegroupements()
            {
                regroupements.Add(new RegroupementViewModel()
                {
                    Id = 1,
                    Code = "RG1",
                    Libelle = "Regroupement1"
                });
                regroupements.Add(new RegroupementViewModel()
                {
                    Id = 2,
                    Code = "RG2",
                    Libelle = "Regroupement2"
                });
                regroupements.Add(new RegroupementViewModel()
                {
                    Id = 3,
                    Code = "RG3",
                    Libelle = "Regroupement3"
                });
            }
     
            private void UserControl_Loaded(object sender, RoutedEventArgs e)
            {
                LoadRegroupements();
            }
            private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                Regroupement = (RegroupementViewModel)comboBox1.SelectedItem;
            }
        }
    XAML de ma fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <Window x:Class="WpfApplication3.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
            xmlns:src="clr-namespace:WpfApplication3"
            Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:WpfApplication3.UserControls">
        <Grid>
            <my:UserControl1 HorizontalAlignment="Left" Margin="134,138,0,0" x:Name="userControl11" VerticalAlignment="Top" />
        </Grid>
    </Window>
    Code Behind de ma fenêtre :
    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
    public partial class MainWindow : Window
        {
     
            RegroupementViewModel Regroupement;
     
            public MainWindow()
            {
                InitializeComponent();
     
                DataContext = this;
     
                Regroupement = new RegroupementViewModel()
                {
                    Id = 1,
                    Code = "RG1",
                    Libelle = "Regroupement1"
                };
            }
        }
    Mon ViewModel :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    public class RegroupementViewModel : INotifyPropertyChanged
        {
            private string _Libelle;
            private string _Code;
            private int _Id;
     
            public string Libelle
            {
                get
                {
                    return _Libelle;
                }
                set
                {
                    _Libelle = value;
                    OnPropertyChanged("Libelle");
                }
            }
     
            public string Code
            {
                get
                {
                    return _Code;
                }
                set
                {
                    _Code = value;
                    OnPropertyChanged("Code");
                }
            }
     
            public int Id
            {
                get
                {
                    return _Id;
                }
                set
                {
                    _Id = value;
                    OnPropertyChanged("Id");
                }
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            protected void OnPropertyChanged(string name)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(name));
                }
            }
        }
    Ce que je voudrais faire, c'est faire en sorte que la propriété Regroupement de ma fenêtre soit mise à jours en fonction de la valeur de la dependencyproperty Regroupement de mon UC et que le Code affiché dans le label soit lié au code de la dependencyproperty.

    J'ai un peu de mal à comprendre le fonctionnement de la liaison de donnée en WPF et je pense que résoudre ce petit problème m'en apprendrait beaucoup et en aiderait surement d'autre.

    La sélection d'un élément dans ma combobox modifie bien la dependencyproperty, comment faire pour que le label soit mis à jour ? Et comment faire pour que la dependecyproperty change si je modifie le Regroupement de ma fenêtre et l'inverse ?

    Merci d'avance.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 95
    Par défaut
    En cherchant à en apprendre un peu plus sur l'élément Binding, j'ai réussi à avoir le comportement que je cherchais dans mon UserControl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <UserControl x:Class="WpfApplication3.UserControls.UserControl1"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="29" d:DesignWidth="316"
                 Loaded="UserControl_Loaded">
        <Grid>
            <Label Content="{Binding Path=Regroupement.Code, Mode=OneWay}" Height="30" HorizontalAlignment="Left" Name="label1" VerticalAlignment="Top" Width="72" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" />
            <ComboBox Height="30" HorizontalAlignment="Left" Margin="78,0,0,0" Name="comboBox1" VerticalAlignment="Top" Width="158" DisplayMemberPath="Libelle" SelectedValuePath="Id" SelectedValue="{Binding Path=Regroupement.Id, Mode=OneWay}" SelectedItem="{Binding Path=Regroupement, Mode=OneWayToSource}"/>
        </Grid>
    </UserControl>
    Mon Label est bien mis à jour sur modification du Regroupement et si je modifie le Regroupement directement dans le code alors la combobox est positionné automatiquement sur le bon Regroupement.
    Edit : J'ai aussi changer le comportement de la combobox, plutot que de mettre à jour le regroupement sur l'evenement selecteditemchanged de la combobox, j'ai bind sa propriété ItemSelected sur Regroupement en mode OneWayToSource.

    Je n'arrive cependant toujours pas à Binder la propriété de ma fenêtre à la propriété de mon UC.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Quand tu fais dans le XAML :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <my:UserControl1 HorizontalAlignment="Left" Margin="134,138,0,0" x:Name="userControl11" VerticalAlignment="Top" Regroupement={Binding Regroupement}/>

    ça ne marche pas ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 95
    Par défaut
    Non, la valeur de Regroupement Dans MainWindow ne bouge pas et le Regroupement de l'UC n'est pas initialisé à la création de l'UC.

    Edit :

    J'ai résolu mon problême. J'avais mis le mode du binding sur SelectedItem en OneWayToSource, cela avait pour effet de mettre l'apporteur à nul, la combobox n'ayant aucun élément sélectionné à sa construction, (ce qui se fait pourtant juste après à l'aide du binding de SelectedValue sur l'Id de Regroupement).
    Je ne comprend pas pourquoi cela empêchait quand même de binder les deux propriété Regroupement de l'UC et de la Fenêtre.

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

Discussions similaires

  1. Binding sur une propriete
    Par Seth77 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/08/2008, 15h47
  2. Réponses: 5
    Dernier message: 30/01/2008, 09h18
  3. [Binding] Binding sur une collection polymorphe
    Par davcha dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 12/12/2007, 00h04
  4. [Databinding] bind sur une propriété d'une collection
    Par herveb dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 11/12/2007, 10h35
  5. binding sur une string
    Par fxp17 dans le forum JSF
    Réponses: 8
    Dernier message: 08/09/2006, 11h38

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