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 :

RichTextBox et Binding - WPF


Sujet :

Windows Presentation Foundation

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut RichTextBox et Binding - WPF
    Bonjour,
    J'utilise VS2008 avec C#.
    J'ai besoin d'aide pour mon application.
    J'aimerai savoir comment se passe le binding avec un richTextBox(rtb).
    Si quelqu'un a une idée!!!
    Voila, j'ai un rtb dans mon application.
    Code xaml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <UserControl.Resources>
            <ResourceDictionary>
                <ObjectDataProvider x:Key="odpDescription"/>
            </ResourceDictionary>
        </UserControl.Resources>
     
        <Grid IsEnabled="{Binding Source={StaticResource odpDescription}}" >
            <GroupBox Header="Description" Margin="0,4,0,2" Name="gbDescription">
                <RichTextBox Height="57" Name="rtbDescription" Width="400"  VerticalScrollBarVisibility="Visible"/>           
            </GroupBox>
        </Grid>
    Code behind 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
    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 partial class DescriptionControl : UserControl
        {
            #region Constructeur
     
            public DescriptionControl()
            {
                InitializeComponent();            
                odpDescription = (ObjectDataProvider)this.FindResource("odpDescription);
            }
     
            #endregion
     
            #region Membres
     
            private ObjectDataProvider odpDescription = null;               
     
            #endregion
     
            #region DependencyProperties
     
            public static readonly DependencyProperty DescriptionProperty = DependencyProperty.Register("Description",
                typeof(Description), typeof(DescriptionControl),
                new FrameworkPropertyMetadata(new Description(), new PropertyChangedCallback(OnDescriptionChanged)));
     
            #endregion
     
            #region DependencyPropertiesMethods
     
            private static void OnDescriptionChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
            {
                DescriptionControl descriptionControl = (DescriptionControl)obj;
                descriptionControl .OdpDescription = descriptionControl.Description;            
            }
     
            #endregion
     
            #region Clr Accessors
     
            public Description OdpDescription
            {
                get { return (odpDescription != null ? (Description)odpDescription.ObjectInstance : null); }
                set
                {
                    if (odpDescription != null)
                        odpDescription.ObjectInstance = value;
                }
            }
     
            public Description Description
            {
                get { return ((Description)GetValue(DescriptionProperty)); }
                set { SetValue(DescriptionProperty, value); }
            }
            #endregion            
        }
    Classe Description
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Description
        {
            private string commentaire;       
     
            public String Commentaire
            {
                get { return commentaire; }
                set { commentaire = value; }
            }
        }
    J'aimerais "binder" le rtb avec l'attribut "commentaire" de type string. J'ai créé le odpDescription pour faire le binding mais après je suis bloqué.
    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour la réponse.
    J'ai créé la classe et je l'ai importé dans mon userControl mais après la suite je ne sais pas.
    J'avoue que je ne sais pas comment faire pour la suite, le binding du rtb avec l'attribut commentaire (string).
    Est-ce que je dois changer le DP en : au lieu du FlowDocument je met "String"????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static readonly DependencyProperty DocumentProperty = DependencyProperty.Register("Document",
                typeof(String), typeof(BindableRichTextBox), new FrameworkPropertyMetadata(null, new PropertyChangedCallback(OnDocumentChanged)));
    Merci d'avance

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Il faut que tu fasses un binding entre ton commentaire et la propriéé Document. Comme ce sont 3 types différents, il te faut un converteur pour convertir ta string en FlowDocument

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Maintenant j'ai créé une classe pour le converter StringToFlowDocument.
    J'ai utilisé la classe pour le binding mais cela ne marche pas.
    Coté xaml j'ai ajouté : (en gras)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <UserControl.Resources>
            <ResourceDictionary>
                <ObjectDataProvider x:Key="odpDescription"/>
    <Converter:StringToFDocumentConverter x:Key="converterS2FD"/>
            </ResourceDictionary>
        </UserControl.Resources>
        
        <Grid IsEnabled="{Binding Source={StaticResource odpDescription}}" >
            <GroupBox Header="Description" Margin="0,4,0,2" Name="gbDescription">
                <RichTextBox Height="57" Name="rtbDescription" Width="400"  VerticalScrollBarVisibility="Visible" Document="{Binding Description, Converter={StaticResource converterS2FD}}"/>           
            </GroupBox>
        </Grid>
    Voici le msg d'erreur :
    Error A 'Binding' cannot be set on the 'Document' property of type 'RichTextBox'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
    Que dois-je faire?
    Merci pour votre aide.

  6. #6
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut


    Ca veut dire que Document n'est pas une DependencyProperty et donc, tu peux pas faire de binding dessus

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour l'explication!!!
    Quelqu'un aurait-il l'idée pour le binding?
    Merci.

  8. #8
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Solution trouvée via google et assez élégante ma foi.

    Attention cependant, elle est restreinte à un binding OneWay..

    http://11011.net/archives/000650.html

    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
     
    <Window x:Class="PropertyBinding.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:utils="clr-namespace:"
        >
        <Grid>
            <Grid.DataContext>
                <FlowDocument>
                    <Paragraph>Bind <Bold>This!</Bold></Paragraph>
                </FlowDocument>
            </Grid.DataContext>
            <RichTextBox Height="200" Name="rtb" />
            <utils:Proxy In="{Binding}" Out="{Binding ElementName=rtb, Path=Document}" />
        </Grid>
    </Window>

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    public class Proxy : FrameworkElement
        {
            public static readonly DependencyProperty InProperty;
            public static readonly DependencyProperty OutProperty;
     
            public Proxy()
            {
                Visibility = Visibility.Collapsed;
            }
     
            static Proxy()
            {
                FrameworkPropertyMetadata inMetadata = new FrameworkPropertyMetadata(
                    delegate(DependencyObject p, DependencyPropertyChangedEventArgs args)
                    {
                        if (null != BindingOperations.GetBinding(p, OutProperty))
                            (p as Proxy).Out = args.NewValue;
                    });
     
                inMetadata.BindsTwoWayByDefault = false;
                inMetadata.DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
     
                InProperty = DependencyProperty.Register("In",
                    typeof(object),
                    typeof(Proxy),
                    inMetadata);
     
                FrameworkPropertyMetadata outMetadata = new FrameworkPropertyMetadata(
                    delegate(DependencyObject p, DependencyPropertyChangedEventArgs args)
                    {
                        ValueSource source = DependencyPropertyHelper.GetValueSource(p, args.Property);
     
                        if (source.BaseValueSource != BaseValueSource.Local)
                        {
                            Proxy proxy = p as Proxy;
                            object expected = proxy.In;
                            if (!object.ReferenceEquals(args.NewValue, expected))
                            {
                                Dispatcher.CurrentDispatcher.BeginInvoke(
                                    DispatcherPriority.DataBind, new Operation(delegate
                                    {
                                        proxy.Out = proxy.In;
                                    }));
                            }
                        }
                    });
     
                outMetadata.BindsTwoWayByDefault = true;
                outMetadata.DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
     
                OutProperty = DependencyProperty.Register("Out",
                    typeof(object),
                    typeof(Proxy),
                    outMetadata);
            }
     
            public delegate void Operation();
     
            public object In
            {
                get { return this.GetValue(InProperty); }
                set { this.SetValue(InProperty, value); }
            }
     
            public object Out
            {
                get { return this.GetValue(OutProperty); }
                set { this.SetValue(OutProperty, value); }
            }
        }

  9. #9
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Pas bête du tout

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

Discussions similaires

  1. Combobox et Binding wpf
    Par Lionhart dans le forum C#
    Réponses: 0
    Dernier message: 06/08/2014, 11h49
  2. [MVVM] Binding WPF pattern MVVM
    Par TarteAuCitron dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 03/03/2013, 18h36
  3. [Débutant] DependencyProperty Binding WPF
    Par Samyy17 dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 25/02/2013, 12h01
  4. [Débutant] DependencyProperty Binding WPF
    Par Samyy17 dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/02/2013, 10h24
  5. Quel type de collection utilisez-vous pour le binding WPF ?
    Par FRED.G dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 04/07/2008, 21h55

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