Menu

Utilisation d'un Binding avec un StackPanel [Résolu]

Messages postés
23
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
19 mai 2019
-
Bonjour, je commence la programmation en WPF et je suis fasse à un petit problème... Je veux passe tu texte et le chemin d'une image par un Binding, cependant comme ces éléments sont dans un StackPanel mon code fonctionne pas. Malgré plusieurs tentative pour corriger ce problème j'en suis toujours au même point. Pourriez-vous m'aider ?

Merci d'avance.
Cordialement.


Code WPF


<Grid>
       

        <StackPanel Name="Master" Grid.Column="0" Margin="15,25,0.4,15">
            
            <StackPanel>
                <Ellipse Margin="10,50,10,20" Width="200" Height="200" Stroke="White" StrokeThickness="4">
                    <Ellipse.Fill>
                        <ImageBrush ImageSource="{Binding Images}"/>
                    </Ellipse.Fill>
                </Ellipse>

                <TextBlock TextWrapping="Wrap" TextAlignment="Center" Text="{Binding Appelation}"/>
            </StackPanel>
            

        </StackPanel>

    </Grid>




Code C#


public Window6()
        {
            InitializeComponent();      
            var horreur = new Genre("Horreur", "Vous avez envie de vous donner quelques frissons ?" +
                " Alors restez bien assie et proffiter de notre large choix de série d'horreur !",
                "../Medias/Photos/Genre_horreur.jpg");
            Presentation_horreur = horreur;
        }




Classe Genre


namespace Atsa.Classes
{
    class Genre
    {
        public string Appelation { get; set; }
        public string Description { get; set; }
        public string Images { get; set; }


        public Genre( String appelation, String description, String image)
        {
            this.Appelation = appelation;
            this.Description = description;
            this.Images = image;
        }
    }
}
Afficher la suite 

Votre réponse

5 réponses

Messages postés
13295
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 mai 2019
472
0
Merci
Dans ton code behind, je ne vois pas où tu bindes le contenu du stackpanel.
Et dans ton xaml je ne voie pas où tu veux récupérer ce contenu.

D'ailleurs y'a des trucs qui ne servent à rien dans ton xaml

<Grid><!--T'as pas défini de colonnes, donc plus bas pas la peine de dire que c'est attaché à la colonne 0-->
       

        <StackPanel Name="Master" Grid.Column="0" Margin="15,25,0.4,15">
            
            <StackPanel><!--Ce 2eme stackpanel est inutile, il fait exactement la même chose que le premier-->
                <Ellipse Margin="10,50,10,20" Width="200" Height="200" Stroke="White" StrokeThickness="4">
                    <Ellipse.Fill>
                        <ImageBrush ImageSource="{Binding Images}"/>
                    </Ellipse.Fill>
                </Ellipse>

                <TextBlock TextWrapping="Wrap" TextAlignment="Center" Text="{Binding Appelation}"/>
            </StackPanel>
            

        </StackPanel>

    </Grid>


PS pour la coloration, du xaml, c'est du xml

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Hamster18
Messages postés
23
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
19 mai 2019
-
Les premiers StackPanel vient du fait que j'ai couper mon code pour que ça fasse moins lourd... Dans le C# j'avais fait un :


            Presentation_horreur.ItemsSource = horreur;



Cependant cette ligne m'entraine l'erreur " objet ne contient pas de définition pour ItemsSource...", du coup je l'ai enlever...

Dans le code XAML j'ai oublier de mettre la balise Window dans lequel je définie :


DataContext="Presentation_horreur"





j'ai donc un code XAML ressemblant à cela :



<Window x:Class="Atsa.Fenetres.Window6"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Atsa.Fenetres"
        mc:Ignorable="d"
        DataContext="Presentation_horreur"
        Title="Window6" Height="450" Width="800">

<Grid>
       
            
            <StackPanel>
                <Ellipse Margin="10,50,10,20" Width="200" Height="200" Stroke="White" StrokeThickness="4">
                    <Ellipse.Fill>
                        <ImageBrush ImageSource="{Binding Images}"/>
                    </Ellipse.Fill>
                </Ellipse>

                <TextBlock TextWrapping="Wrap" TextAlignment="Center" Text="{Binding Appelation}"/>
            </StackPanel>


    </Grid>




Cordialement.
Commenter la réponse de Whismeril
Messages postés
13295
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 mai 2019
472
0
Merci
Cependant cette ligne m'entraine l'erreur " objet ne contient pas de définition pour ItemsSource...", du coup je l'ai enlever...
au vu de cette ligne
Presentation_horreur = horreur;
je suppose que Présentation_horreur est du type Genre, et Genre n'a pas d'ItemSource.

DataContext="Presentation_horreur"

Non, vaux mieux
DataContext="{Binding}"

avec
public Window6()
        {
            InitializeComponent();      
            var horreur = new Genre("Horreur", "Vous avez envie de vous donner quelques frissons ?" +
                " Alors restez bien assie et proffiter de notre large choix de série d'horreur !",
                "../Medias/Photos/Genre_horreur.jpg");
            Presentation_horreur = horreur;
            this.DataContext = Presentation_horreur;//là on affecte la source de données, variable, collection etc.
        }


Peut-être aussi, faut il dire aux contrôles enfants, que leur DataContext est le même que celui du parent avec
DataContext="{Binding .}"

<Window x:Class="Atsa.Fenetres.Window6"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Atsa.Fenetres"
        mc:Ignorable="d"
        DataContext="{Binding}"
        Title="Window6" Height="450" Width="800">

<Grid DataContext="{Binding .}"><!--ici-->
       
            
            <StackPanel DataContext="{Binding .}"><!--et là-->
                <Ellipse Margin="10,50,10,20" Width="200" Height="200" Stroke="White" StrokeThickness="4">
                    <Ellipse.Fill>
                        <ImageBrush ImageSource="{Binding Images}"/>
                    </Ellipse.Fill>
                </Ellipse>

                <TextBlock TextWrapping="Wrap" TextAlignment="Center" Text="{Binding Appelation}"/>
            </StackPanel>


    </Grid>
Hamster18
Messages postés
23
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
19 mai 2019
-
Merci beaucoup ça fonctionne ! J'aurais une autre question, quand je crée un objet dans la code C# pour en bindes les données à la page associé (Window1 par exemple) es possible de réutiliser cet même objet (pour bindes les données par exemple) sans devoir recréer cet objet dans la le code C# de la nouvelle fenêtre (Window 5 par exemple) ?

Merci d'avance.
Cordialement.
Commenter la réponse de Whismeril
Messages postés
13295
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 mai 2019
472
0
Merci
Bonjour
J’ai écrit un tuto en winform sur le sujet, en WPF le principe reste le même
https://codes-sources.commentcamarche.net/faq/11107-interactions-entre-form-en-net-c-et-vb-net
Hamster18
Messages postés
23
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
19 mai 2019
-
Merci, j'ai commencé à regarder un peu, mais je ne vois pas comment faire... Je fais faire des recherches complémentaires et si je n'y arrive pas je me retournerais vers vous.

Merci d'avance.

Cordialement.
Commenter la réponse de Whismeril
Messages postés
13295
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 mai 2019
472
0
Merci
Dans Windows1, j'ai un objet toto, du type LeType.

Je veux le passer à Windows5, j'ajoute donc un paramètre au constructeur de Windows5 du type LeType,

private LeType totoBis
public Windows5(LeType UnParametre)
{
   InitializeComponent();
   totoBis = UnParametre;
}


et dans Windows1
Windows5 wdw = new Windows5(toto);

Hamster18
Messages postés
23
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
19 mai 2019
-
Bonjour, j'ai tenter cette méthode mais elle me provoque des erreurs notamment sur mes Bindind. De plus j'ai un grand nombres de fenêtres ou il faut importer ces données ce qui rend cette mise en place difficile. Serait-il possible de crée les objets en dehors du code behind de la page pour ensuite les utiliser sur les fenêtres voulus (sachant que j'utilise ces données essentiellement pour des bindes)
Merci d'avance de votre réponse.
Cordialement.
Commenter la réponse de Whismeril
Messages postés
13295
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 mai 2019
472
0
Merci
Bonsoir
Serait-il possible de crée les objets en dehors du code behind de la page pour ensuite les utiliser sur les fenêtres voulus

ça s'appelle une variable globale, c'est généralement déconseillé, et c'est même considéré comme une erreur de conception en programmation objet, car cela expose la donné à tout va.
Je t'ai donné un Verre comme exemple, et bien il n'a pas à avoir accès aux données d'une tondeuse par exemple, avec une variable globale ça pourrait arriver.

j'ai tenter cette méthode mais elle me provoque des erreurs notamment sur mes Bindind.

S'il y a erreur avec les binding, une variable globale n'y changerait rien.
Sans éléments (code, valeurs au moment des erreurs, circonstances etc...) impossible de t'aider.

De plus, je serai absent quelques jours, il faudra attendre un autre membre ou mon retour.

WPF nécessite de bien comprendre le fonctionnement de la programmation objet, et de bien coder en C# aussi.

Tu pourrais mettre ton projet de coté quelques jours, le temps de suivre ce cours http://tahe.developpez.com/dotnet/csharp/, il te donnera des bonnes bases en C#.
Tu peux aussi suivre un cours d'UML, pour l'objet ça peut être bien (j'ai fait sans, mais ça m'a pris du temps).
Eventuellement, tu peux aussi lire ce tuto, https://codes-sources.commentcamarche.net/faq/11239-la-programmation-objet-appliquee-a-net-par-l-exemple-partie-1-sur-3 il reflète 10 années d'autodidacte en C#

Hamster18
Messages postés
23
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
19 mai 2019
-
D'accord je vais m'y pencher.
Merci.
Cordialement.
Commenter la réponse de Whismeril