Utilisation d'un Binding avec un StackPanel

Résolu/Fermé
Hamster18 Messages postés 178 Date d'inscription mercredi 2 janvier 2019 Statut Membre Dernière intervention 22 janvier 2024 - Modifié le 5 mai 2019 à 20:52
Hamster18 Messages postés 178 Date d'inscription mercredi 2 janvier 2019 Statut Membre Dernière intervention 22 janvier 2024 - 8 mai 2019 à 23:19
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;
        }
    }
}

5 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
Modifié le 5 mai 2019 à 20:40
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

0
Hamster18 Messages postés 178 Date d'inscription mercredi 2 janvier 2019 Statut Membre Dernière intervention 22 janvier 2024
Modifié le 5 mai 2019 à 21:10
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.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
5 mai 2019 à 21:38
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>
0
Hamster18 Messages postés 178 Date d'inscription mercredi 2 janvier 2019 Statut Membre Dernière intervention 22 janvier 2024
Modifié le 5 mai 2019 à 22:08
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.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
6 mai 2019 à 07:38
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
0
Hamster18 Messages postés 178 Date d'inscription mercredi 2 janvier 2019 Statut Membre Dernière intervention 22 janvier 2024
6 mai 2019 à 18:01
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.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
6 mai 2019 à 20:19
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);

0
Hamster18 Messages postés 178 Date d'inscription mercredi 2 janvier 2019 Statut Membre Dernière intervention 22 janvier 2024
7 mai 2019 à 22:23
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
8 mai 2019 à 00:03
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 https://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#

0
Hamster18 Messages postés 178 Date d'inscription mercredi 2 janvier 2019 Statut Membre Dernière intervention 22 janvier 2024
8 mai 2019 à 23:19
D'accord je vais m'y pencher.
Merci.
Cordialement.
0