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] Binding tableau de contrôle utilisateur


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] Binding tableau de contrôle utilisateur
    Bonjour à tous,

    Je n'arrive pas a visualiser comment je peux réduire mon code, je m'explique.

    J'ai une vue qui comporte 120 fois les mêmes objets dans un <TabControl> comportant 4 <TabItem>.
    Chacun de ces 120 objets contiennent des zones simulant des voyants et du texte pour afficher des mesures, en tout 10 informations.
    J'ai donc créer un contrôle utilisateur avec ces 10 zones d'information que je dois implanter sur ma vue.

    Mais cela me fait quand même 120 fois ce contrôle utilisateur.
    voici le 1er Object integrer dans ma vue:

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    <basic:V_Rectifier Grid.Row="0" Grid.Column="1" DataContext="{Binding Rectifier1}" Margin="2" VerticalAlignment="Top" />

    Ensuite dans ma "Vue Modèle" je sais comment atteindre mes "Property" pour afficher ce que j'ai besoin par le Binding Rectifier1, mais y a t'il un moyen plus facile.

    Même si j'ai les 120 déclarations à faire dans le XAML:

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <basic:V_Rectifier Grid.Row="0" Grid.Column="1" DataContext="{Binding Rectifier1}" Margin="2" VerticalAlignment="Top" />
    <basic:V_Rectifier Grid.Row="0" Grid.Column="2" DataContext="{Binding Rectifier2}" Margin="2" VerticalAlignment="Top" />
    <basic:V_Rectifier Grid.Row="0" Grid.Column="3" DataContext="{Binding Rectifier3}" Margin="2" VerticalAlignment="Top" />
    <basic:V_Rectifier Grid.Row="0" Grid.Column="4" DataContext="{Binding Rectifier3}" Margin="2" VerticalAlignment="Top" />
    <basic:V_Rectifier Grid.Row="0" Grid.Column="5" DataContext="{Binding Rectifier4}" Margin="2" VerticalAlignment="Top" />
    <basic:V_Rectifier Grid.Row="0" Grid.Column="6" DataContext="{Binding Rectifier5}" Margin="2" VerticalAlignment="Top" />
    ...

    Si je pouvais au moins utiliser un tableau dans ma "Vue Modèle" pour faciliter le balayage des données à afficher. Bon Bien sûr je pourrais les réaffecter dans un tableau après avoir effectué la déclaration des 120 property, mais s'il y a un moyen plus simple.

    Bon déjà je viens de constater, en vous écrivant, que je pourrais m’éviter d'utiliser un Grid, mais plutôt un stackpanel horizontal pour chaque ranger de "ControlUser".

    Dans chaque TabItem j'ai 2 rangés de 16 "ControlUser". Le tout dans 4 tabItem.

    Merci

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    si tu as une collection de 120 objets ayant x propriétés tu peux faire un itemscontrol avec un itemtemplate, ca génère les 120 uc automatiquement
    un itemscontrol est un listbox sans selection, donc juste pour afficher n choses
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    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
    Citation Envoyé par Pol63 Voir le message
    si tu as une collection de 120 objets ayant x propriétés tu peux faire un itemscontrol avec un itemtemplate, ca génère les 120 uc automatiquement
    un itemscontrol est un listbox sans selection, donc juste pour afficher n choses
    J'y est pas du tout pensé, merci, je vais essayer cela.
    Je n'ai que de la visu sur ces objets, sauf le clic. En cliquant sur l'un des "Controluser" j'ouvre une autre vue avec plus de détails ainsi que de la saisie possible.
    Les voyant et mesures sont aussi afficher en temps réel, (enfin suivant le cycle d'une tempo qui interroge et rafraîchi les données).

    Toutefois j'ai vu que l'on doit pouvoir gérer un index de tableau, ICI, mais je n'arrive pas a le mettre en application pour le moment.

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
     <basic:V_Rectifier  DataContext="{Binding Path=[1].Rectifier}" Margin="2" VerticalAlignment="Top" />

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Property Rectifier As Dictionary(Of Integer, VM_Rectifier)
    Cela ne fonctionne pas bien sûr, malgré que cela compile sans souci.

  4. #4
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour
    Toutefois j'ai vu que l'on doit pouvoir gérer un index de tableau, ICI, mais je n'arrive pas a le mettre en application pour le moment.
    Ce qui est donné dans ce lien Microsoft concerne le tableau UNIDIMENSIONNEL...
    Mais vu la "quantité" d'infos à visualiser dans une seule fenetre ,ce design me parait peu pertinent pour le "povre" user ...

    Neanmoins tu peux utiliser soit un ItemsControl comme dit par Pol63, soit un List(of List(of T) qui est l'analogue d' un tableau multidimensionel associé ,ou chaque "item principal" correspond à un List(of item) ...
    Pour afficher ce List(of List(of T) , un Listbox exemple(principal) est utilisé dont l'Itemplate contient un autre Listbox bindé à chaque ligne (-List(of item)-)..
    code exemple .vb

    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
    Imports System.ComponentModel
     
    Public Class Item
        Implements INotifyPropertyChanged
        Private m_id As Integer
        Public Property Id() As Integer
            Get
                Return m_id
            End Get
            Set(ByVal value As Integer)
                m_id = value
                OnPropertyChanged("Id")
            End Set
        End Property
     
        Private m_name As String
        Public Property Name As String
            Get
                Return m_name
            End Get
            Set(value As String)
                m_name = value
                OnPropertyChanged("Name")
            End Set
        End Property
        Private m_info As String
        Public Property Info As String
            Get
                Return m_info
            End Get
            Set(value As String)
                m_info = value
                OnPropertyChanged("Info")
            End Set
        End Property
        Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
        Private Sub OnPropertyChanged(propName As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName))
        End Sub
    End Class
     
     
     
    Imports System.Collections.ObjectModel
    Public Class ListItems
        Inherits ObservableCollection(Of ObservableCollection(Of Item))
     
        Public Sub New()
            Dim arr(119, 9) As Item
     
            For i As Integer = 0 To arr.GetUpperBound(0)
                For j As Integer = 0 To arr.GetUpperBound(1)
                    Dim it As New Item() With {.Id = i, .Name = "Item" + i.ToString + j.ToString, .Info = "Info" + j.ToString}
                    arr(i, j) = it
                Next
            Next
            For i As Integer = 0 To arr.GetUpperBound(0)
                Me.Add(New ObservableCollection(Of Item))
                For j As Integer = 0 To arr.GetUpperBound(1)
                    Me.Item(i).Add(arr(i, j))
                Next
            Next
        End Sub
    End Class
    code xam du form:

    Code XAML : 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
    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns:local="clr-namespace:WpfBindArrayMulti" 
        Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <local:ListItems x:Key="items"/>
            <Style x:Key="HorizontalListBox">
                <Setter Property="ListBox.ItemsPanel">
                    <Setter.Value>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal" />
                        </ItemsPanelTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
            <DataTemplate x:Key="CellTemplate"
                          DataType="{x:Type local:Item}">
                <Border BorderThickness="2" BorderBrush="DarkGray" 
                   CornerRadius="2"  >
                    <StackPanel Orientation="Horizontal">
                        <Button Margin="5"  Content="ShowViewA"/>
                        <TextBlock Margin="5" Text="{Binding Id}"/>
                        <TextBlock Margin="5" Text="{Binding Name}"/>
                        <TextBlock Margin="5" Text="{Binding Info}"/>
                    </StackPanel>
     
                </Border>
            </DataTemplate>
            <DataTemplate x:Key="RowTemplate"
                          >
                <ListBox  
                    BorderThickness="0"
                       ItemsSource="{Binding}" 
                       Style="{StaticResource HorizontalListBox}" 
                       ItemTemplate="{StaticResource CellTemplate}" />
            </DataTemplate>
        </Window.Resources>
        <Grid>
            <ListBox 
                x:Name="lb"
                ItemsSource="{Binding  Source={StaticResource items}}" 
                ItemTemplate="{StaticResource RowTemplate}" />
        </Grid>
    </Window>
    pas de code behind...

    nb: vu cette interface un peu "rebutante" ,il vaut mieux utiliser trois UserControl en dispatchant le tableau via 4 tabitems...(pagination)....

  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
    Merci à vous pour toutes ces précisions,

    Hier soir j'ai regardé du coté de ce que m'a proposé Pol63, mais j'avoue que les exemple trouvé sur le net ne mon pas beaucoup aidé. Je vais donc regarder ce matin ton exemple MABROUKI et continuer à chercher, en espérant que j'arrive à le comprendre.

    Voici ma présentation actuel:

    Nom : RectifierPlant.png
Affichages : 468
Taille : 41,7 Ko

    Sur cette photo les couleurs sont posés sur le Control user à des fin de test, et le dernier objet avec un "1" devra être renseigner avec le numéro du redresseur concerné (rectifier) de 1 à 120 donc.

    Le système en face est modulaire, donc il n'y aura pas tous le temps 120 redresseurs, c'est le max admissible. Je dois mettre à jour uniquement les redresseurs présent. J'ai une procédure pour récupérer le nombre et la position des redresseurs.

    Mon logiciel est nouveau (1er logiciel réaliser en WPF et en autoformation, un grand merci à la communauté "Developpez.net" en passant), mais l'architecture est issue d'une base réalisée en VB6, j'en garde un maximum d’algorithme et de logique, afin de ne pas trop s'y perdre lors de la maintenance ou modification, mais WPF change radicalement la manière d’accéder à la vue bien sûr, surtout en essayant de respecter le patern MVVM.
    En Vb6 tous les objets sont sur la vue (120x10 sans compter les autres object sur une autre page du tabcontrol), pas de usercontrol, mais par exemple, les voyants Installed (ici en rouge) sont des tableaux d'image déclarer directement dans la vue par les index, ce qui n'existe plus depuis Dotnet.
    Ensuite pour le traitement ce ne sont que des boucles de chaque ligne qui sont mise à jour.


    Le code originel en VB6 n'est pas de moi.

    Merci encore.

    [EDIT]
    Je viens de monter un projet test avec votre code MABROUKI, bien-sûr tel quel ce n'est pas l'idéal, question ergonomie pour l'utilisateur, il faut que je le repartisse sur plusieurs page, ou utiliser uniquement la scrollbar horizontal, mais votre exemple est clair et me permet de comprendre un peu mieux le principe, merci beaucoup.

    En reprenant la vue exemple (photo) ci dessous que je vous est mis ce matin, chaque onglet (header) du tabcontrol contient aussi un voyant à coté du texte. Ce voyant doit s'allumer si dans les éléments présent une alarme est activé sur au moins l'un des redresseurs surveillé, afin d’alerter l'utilisateur et qu'il y accède rapidement. Avec un gros scrolling, c'est moins facile pour l'utilisateur, mais je vais creuser la question.

    Merci.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Utilises une ObservableCollection à la place d'un dictionnaire pour Rectifier.

    Code XAML : 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
    <Grid>
      ............
       ....... Affichage de "Installed" "Logged"......
       .........
    <ItemsControl ItemsSource="{Binding Path=Rectifier, Mode=OneWay}" Grid.Column=1 >
        <ItemsControl.ItemTemplate>
            <DataTemplate >
                 <basic:V_Rectifier Margin="2" VerticalAlignment="Top" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate >
                <StackPanel Orientation="Vertical" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
     
    </Grid>

Discussions similaires

  1. [Debutant] - WPF MVVM Binding XML in Treeview
    Par Ganeshiva dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 29/03/2017, 11h27
  2. WPF MVVM binding Contextmenu sur ListboxItem
    Par gurcan dans le forum C#
    Réponses: 0
    Dernier message: 10/06/2016, 13h43
  3. [Débutant] WPF MVVM Afficher Message a l'utilisateur
    Par draco951 dans le forum C#
    Réponses: 2
    Dernier message: 05/02/2013, 11h10
  4. WPF MVVM Binding Refresh
    Par gridin dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 14/01/2011, 11h26
  5. Binding entre 2 contrôles WPF
    Par mascoco dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 28/06/2010, 17h51

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