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

VB.NET Discussion :

[WPF MVVM] Tuto pour comprendre les dépendances d'un User Control


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut [WPF MVVM] Tuto pour comprendre les dépendances d'un User Control
    Bonjour à tous,

    J'ai créé un petit contrôle utilisateur ou j'ai besoin de lui passer un titre (String), une image qui restera fixe et une image qui évoluera (en gros c'est un voyant d'alarme). Pour le moment je n'est que cela, mais éventuellement je repasserais plu-tard des paramètres concernant les graphismes (couleur de fond, couleur de texte ou bordure etc...)

    Je charge ce contrôle utilisateur dans des boutons sur ma vue principal ou j'ai besoin d'un traitement lorsque l'utilisateur clique dessus.

    Pour le moment mon contrôle utilisateur s'affiche parfaitement dans mes boutons. Mais je n'arrive pas a interagir avec mes propriété du ModeleVue.
    Mon contrôle utilisateur à été construit avec la view, le model et la modeleview.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public Class M_ShapePlant
        Public Property Name As String
        Public Property LBL_Shape As String
        Public Property IMG_Shape As BitmapImage
        Public Property IMG_Alarm As BitmapImage
    End Class
    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
    Public Class VM_ShapePlant
        Inherits VM_Base
        Private Modele As New M_ShapePlant
     
        Public Sub New()
     
        End Sub
     
    #Region "Property Language and Visibility"
        Public Property Name As String
            Get
                Return Modele.Name
            End Get
            Set(value As String)
                Modele.Name = value
                OnPropertyChanged("Name")
            End Set
        End Property
        Public Property LBL_Shape As String
            Get
                Return Modele.LBL_Shape
            End Get
            Set(value As String)
                Modele.LBL_Shape = value
                OnPropertyChanged("LBL_Shape")
            End Set
        End Property
        Public Property IMG_Shape As BitmapImage
            Get
                Return Modele.IMG_Shape
            End Get
            Set(value As BitmapImage)
                Modele.IMG_Shape = value
                OnPropertyChanged("IMG_Shape")
            End Set
        End Property
        Public Property IMG_Alarm As BitmapImage
            Get
                Return Modele.IMG_Alarm
            End Get
            Set(value As BitmapImage)
                Modele.IMG_Alarm = value
                OnPropertyChanged("IMG_Alarm")
            End Set
        End Property
        Public Shared ReadOnly LabelProperty As DependencyProperty = DependencyProperty.Register("LBL_Shape", GetType(String), GetType(VM_ShapePlant), New PropertyMetadata(""))
     
    #End Region
    End Class
    J'ai essayé avec les propriétés de dépendance, mais c'est trop flou, si vous avez un tuto pour m'aider. J'ai pas trouvé quelque chose de simple à comprendre. Bien souvent c'est en C# mais bon sa je peux m'en arranger.

    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
     
    <UserControl x:Class="V_ShapePlant"
                 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" 
                 xmlns:local="clr-namespace:WinCoSMMIC"
                 mc:Ignorable="d" Height="65" Width="120">
        <Grid>
     
            <Rectangle Stroke="Black" RadiusX="15" RadiusY="15" StrokeThickness="3" >
                <Rectangle.Fill>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="Black" Offset="0"/>
                        <GradientStop Color="#FFBDB6B6" Offset="1"/>
                    </LinearGradientBrush>
                </Rectangle.Fill>
     
            </Rectangle>
     
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="20"/>
                    <RowDefinition Height="3"/>
                    <RowDefinition Height="40*"/>
                    <RowDefinition Height="3"/>
                </Grid.RowDefinitions>
                <Grid Grid.Row="0">
                    <StackPanel Height="150" >
                        <Rectangle Stroke="Black" 
                                RadiusX="15" 
                                RadiusY="15" Fill="#FF1B1B1B" Margin="0,0,0,-20" StrokeThickness="3"
                                    Height="50">
     
                        </Rectangle>
                    </StackPanel>
     
     
                    <Label Content="{Binding LBL_Shape,FallbackValue='AC PLANT'}" 
                           HorizontalAlignment="Center" 
                           FontSize="14"
                           HorizontalContentAlignment="Center" 
                           Foreground="#FFFFFF1B" 
                           Margin="10,-4,10,-3" 
                           Width="100"  
                           FontWeight="Bold" />
                </Grid>
                <Rectangle Grid.Row="1" 
                           Fill="Black" 
                           Height="3" 
                           VerticalAlignment="Top" />
                <Grid Grid.Row="2">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <Image Grid.Column="0" 
                           Height="30" 
                           Width="30"
                           Source="{Binding IMG_Shape}"
                           Margin="3,0,0,0"/>
                    <Image Grid.Column="1"
                           Height="20"
                           Width="20"
                           Source="{Binding IMG_Alarm}"
                           Margin="0,0,3,0"/>
                </Grid>
            </Grid>
     
        </Grid>
    </UserControl>

    Merci

  2. #2
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Pour un pattern MVVM (xaml) regardes du côté du databinding et surtout ton ViewModel doit implémenter INotifyPropertyChanged.

    Ta classe VM_Shapeplant hérités de VM_Base et elle contient quoi exactement....?
    Tu fais également appelles à onpropertychanged alors que tu n implémentes aucune interface....o_O

    Bon codage ++

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    il hérite de vmbase justement, donc ca doit être elle qui implémente inotify, c'est assez courant, tout comme le observableobject
    après perso je préfère les dependency property
    au passage pour éviter de mettre le nom de la propriété sur les appels à onpropertychanged il y a CallerMemberName dispo depuis fx4.5
    https://docs.microsoft.com/fr-fr/dot...tframework-4.8


    après je ne comprends pas la question (s'il y en a une)
    et il y a des chances que tout ce code ne serve à rien … mais beaucoup ne comprennent pas l'utilité du mvvm et suivent ce même exemple de code en croyant bien faire …
    avant ca il faudrait déjà voir les bindings, les datatemplate et les relaycommand, et après l'architecture sera décidée en fonction du besoin réel
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Bonjour à tous,

    Merci d'avoir pris le temps de répondre, effectivement, VB_Base Implements INotifyPropertyChanged.

    J'utilise aussi relaycommand (ICommand), cela fonctionne bien.

    Merci pour l'information Pol63 sur CallerMemberName, je vais regarder cela.

    Explication complémentaire:
    Mon appli commence à être conséquente, j'ai terminé (ou presque) la partie dites "Usine" pour communiqué avec notre Automate, cette vue permettant de réglé notre automate.
    Pour info, les applications sont développées chez nous en VB6, puis depuis peu j'ai adapté l'un de nos logiciels en VB.net WinForm, mais c'est une adaptation un peu trop brut (trop de copier/coller/adapter) du coup je suis pas fier de moi, car cela rame, bref sur un projet de cette taille il aurait mieux fallu repartir de 0.
    Un nouveau Automate pointant son nez, ont a décidé de repartir presque de 0 avec la technologie WPF toujours en vb.net en respectant le MVVM, mais je suis seul sur le projet et en auto formation, n'arrivant pas à trouver une structure avec suffisamment de monde pour lancer la formation.

    La j'attaque la partie vue client (monitoring) d'ou cet objet Control utilisateur un peu plus jovial dans sa présentation. Cette vue permet de visualiser rapidement l’état du système sur lequel le client communiquera, la remonté d'alarme, les mesures etc.. sous cette Objet (UserControl), plusieurs textBlock affiche les mesures. Une fois que j'aurai compris le moyen d’accéder au propriété du userControl depuis la vue parent, intégrerait peut être les textblock dans ce user control.


    Concernant ma question:
    Ce "user control" sera utilisé 5 fois sur la vue "monitoring", ma question étant: Comment atteindre les propriétés de cet objet depuis la vue parent( LBL_Shape :l’entête (ou titre), IMG_Shape :une image symbolisant une zone du système, (AC / DC / Batterie / Load/ System), ainsi qu'une Image "voyant" IMG_Alarm, le seul à évoluer dans le temps, les autres étant affectés lors de l’instanciation de chaque objet, encore que le titre peut évoluer si l'utilisateur change la langue de l'application).



    En cherchant je suis tombé sur les DependencyProperty, donc pour le moment je tourne autour de cela et essaye de comprendre leur fonctionnement, je continu ce matin.


    Ma vue Monitoring est encore vide pour le moment, seul menu et créer: (MenuItem) chaque MenuItem ont les propriétés Header, IsEnabled, Visibility, command et CommandParameter de Binding.

    Extrait:
    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <MenuItem Name="MnuConfigurator" 
                              Header="{Binding MNU_Configurator_Text, FallbackValue='Configurator'}"
                              IsEnabled="{Binding MNU_Configurator_Enabled, FallbackValue='True'}"
                              Command="{Binding CmdMnuFiles, Mode=OneWay}" 
                              CommandParameter="CONFIG" />
                    <MenuItem Name="MnuAdvConfig" 
                              Header="{Binding MNU_AdvConfig_Text, FallbackValue='Advance Configurator'}"  
                              IsEnabled="{Binding MNU_AdvConfig_Enabled, FallbackValue='True'}"
                              Command="{Binding CmdMnuFiles, Mode=OneWay}" 
                              CommandParameter="ADVCFG" />
                    <Separator />

    J'y est ajouté aussi un autre control utilisateur autonome, qui sera présent sur toutes les vues principaux. Il contient un Statusbar. il présente l’état de la communication avec le système, les niveaux d’accés, l'heure du système (quand je parle de système c'est l'automate... et un voyant indiquant un trafic de données sur la communication (COM ou Ethernet).


    J'ai ajouté le contrôle à ma vue mère,

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    <basic:V_ShapePlant Height="78.333" Width="119" Grid.Column="1" Margin="188.5,170,336,170" />

    Ci joint j'ai remonté un projet d'exemple, bien sûr dans l'état il ne fonctionne pas:
    TestDependance2.zip

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <Button x:Name="CMD_ACPlant" 
                    Grid.Column="0" 
                    Height="90" Width="145" 
                    Command="{Binding CmdCommandPlant}"
                    CommandParameter="AC"
                    Background="Transparent">
                <basic:V_ShapePlant Height="87" Width="142"
                                    LBL_Shape="{Binding LBL_ACPlant}"
                                    IMG_Shape ="{Binding IMG_ACPlant}"
                                    IMG_Alarm ="{binding ALM_ACPlant}"/>
            </Button>


    Merci.

  5. #5
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    J'ai trouvé une solution.

    Sur la vue parent :

    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
    <Button x:Name="CMD_ACPlant" 
                    Grid.Column="0" 
                    Height="90" Width="145" 
                    Command="{Binding CmdCommandPlant}"
                    CommandParameter="AC"
                    Background="Transparent">
                <basic:V_ShapePlant DataContext="{Binding MyShapeAC}" Height="87" Width="142" />
            </Button>
            <Button x:Name="CMD_DCPlant" 
                    Grid.Column="1"
                    Height="90" Width="145" 
                    Command="{Binding CmdCommandPlant}" 
                    CommandParameter="DC"
                    Background="Transparent">
                <basic:V_ShapePlant  DataContext="{Binding MyShapeDC}" Height="87" Width="142" />
            </Button>
    MyShapeAC et MyShapeDC sont déclaré dans le ViewModele du parent:

    VM_Main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        Public Property MyShapeAC As VM_ShapePlant
        Public Property MyShapeDC As VM_ShapePlant
    Ainsi j'ai accès au propriété de chaque ControlUser dans le ViewModele parent.

    MyShapeAC.LBL_Shape
    MyShapeAC.IMG_Shape
    MyShapeAC.IMG_Alarm

    Etc...

    Je ne sais pas si c'est la meilleur solution, mais elle est simple.

Discussions similaires

  1. Réponses: 7
    Dernier message: 24/08/2007, 09h38
  2. Problème pour générer les dépendances
    Par b Oo dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 18/06/2007, 15h45
  3. [MySQL] besoin d'aide pour comprendre les injections sql
    Par cassy dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 28/01/2007, 14h21
  4. Utilitaire pour voir les dépendances d'un projet
    Par Najdar dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 02/11/2006, 21h56
  5. Un outil pour evaluer les dépendances
    Par karbone dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 30/03/2004, 14h36

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