Partage
  • Partager sur Facebook
  • Partager sur Twitter

Meilleur option application WPF + Service Windows

    9 février 2024 à 19:33:23

    Bonsoir à tous,

    J'aimerais avoir votre avis et quelques conseils concernant la réalisation de mon application.
    J'ai développé plusieurs applications C# en autodidacte, essentiellement sur du WinForm.

    Afin de voir d'autre chose, je suis passé récemment au WPF, je ne maitrise pas complètement, voir, pas énormément le Binding de donnée.

    Maintenant que le contexte est posé, j'ai une solution contenant 3 projets :
    • Une application WPF,
    • Un service Windows,
    • Une bibliothèque.



    Le but de la solution et de permettre la modification par le service des interfaces réseau de la machine, sans devoir lancer une application en Admin en permanence.

    La bibliothèque contient une classe permettant avec la quasi-totalité du code du service, cela me permet notamment de charger la nouvelle DLL lorsque je fais une mise à jour. Cette partie fonctionne.
    Elle contient également une deuxième classe utilisée par l'application et le service.


    L'application et le service dialogue en TCP via TcpListener et TcpClient. Chacun instancie un serveur et un client pour le dialogue.
    Cette partie fonctionne.

    Mon application possède une MainWindow avec un Frame permettant de gérer l'affichage de page. Seul le MainWindow instancie le serveur et client TCP.


    J'ai actuellement un souci et j'aimerais votre avis sur la façon de faire.

    Lorsque j'arrive sur une page que j'appelle "Adressage Direct", j'utilise une méthode statique de la MainWindow pour envoyer une demande au service.
    Le service me répond sans problème. Je dois ensuite avec cette donnée remplir une combo-Box qui est sur la page "Adressage Direct" actuellement ouverte.

    J'instancie une ObservableCollection à l'ouveture de la page pour le Bind avec la ComboBox.
    J'ai une méthode Static sur la page "Adressage Direct" qui permet à ma MainWindow, lors de la réponse du service de remplir cette collection.

    Voici le code de la page à ce stade.

    public partial class AdressageDirect : Page
        {
            public string Sel_Combo { get; set; }
            public static ObservableCollection<string> ListCB { get; set; }
    
            public AdressageDirect()
            {
                InitializeComponent();
    
                ListCB = new ObservableCollection<string>();
                DataContext = this;
            }
    
            private void BT_Refresh_Click(object sender, RoutedEventArgs e)
            {
                MainWindow.DemandeInterface();
            }
    
            private void Page_Loaded(object sender, RoutedEventArgs e)
            {
                MainWindow.DemandeInterface();
            }
            
            public static void MAJ_CB()
            {
                ListCB = new ObservableCollection<string>(MainWindow.IPM.ListeNomInterfaces);
            }
        }

    Je bind de cette manière dans le XAML :

    <ComboBox x:Name="CB_Interface" Margin="10,0" VerticalAlignment="Center" Grid.Column="1" FontSize="18" ItemsSource="{Binding Path=ListCB}" SelectedItem="{Binding Sel_Combo}"/>

    Lors de la mise à jour de la collection, en Debug, elle se remplit bien, mais la ComboBox ne bouge pas.
    Aucune erreur de liaison à première vue, car si j'ajoute lors de l'ouverture de la page une donnée à la collection, la combo-box l'affiche bien.

    Enfin, je me dis que je prends peux-être pas le problème dans le bon sens.

    J'aimerais votre avis sur mon problème, mais également selon vous, quand vous avez une application avec des "Pages". Comment réalisez-vous les liens entre l'application "Main" et les différentes pages ?
    J'espère avoir été clair ^^

    Merci à tous d'avance pour vos réponses et votre temps.


    • Partager sur Facebook
    • Partager sur Twitter
    Patience et longueur de temps Font plus que force ni que rage.
      9 février 2024 à 21:14:01

      Avez-vous mise en œuvre des Design Pattern type MVC, MVP, MVVM, Document/vue etc...

      -
      Edité par bacelar 9 février 2024 à 21:14:18

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        10 février 2024 à 14:59:51

        Cc,

        Ne sachant pas de quoi il s'agit je dirais que non ^^

        Merci

        • Partager sur Facebook
        • Partager sur Twitter
        Patience et longueur de temps Font plus que force ni que rage.
          11 février 2024 à 3:47:58

          Jetez un œil dessus pour voir comment gérer une application "multi-pages".
          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            11 février 2024 à 11:47:17

            Coucou,

            J'ai regardé quelques Tuto, présentation, je pense comprendre les avantages du MVVM.

            En reprenant l'exemple d'un tuto que j'ai vu.

            Je peux dire que mes pages sont mes "Views" donc pas besoin de créer cette partie.

            Je crée un Modèle :

            class Interface
                {
                    public string Nom { get; set; }
            
                    public Interface(string name)
                    {
                        Nom = name;
                    }
            
                }

            Et un ViewModele associé :

            class InterfacesModel
                {
                    ObservableCollection<Interface> listeInterface = new ObservableCollection<Interface>();
            
                    public ObservableCollection<Interface> GetInterfaces()
                    {
                        ObservableCollection<Interface> temp = new ObservableCollection<Interface>();
                        foreach (string item in MainWindow.IPM.ListeNomInterfaces)
                        {
                            temp.Add(new Interface(item));
                        }
            
                        return temp;
                    }
                }


            Enfin je modifie ma page (View) pour la ComboBox afin d'obtenir ceci :

            <ComboBox x:Name="CB_Interface" Margin="10,0" VerticalAlignment="Center" Grid.Column="1" FontSize="18" SelectedItem="{Binding Sel_Combo}">
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Nom}" />
                                </DataTemplate>
                            </ComboBox.ItemTemplate>
                        </ComboBox>

            De plus, afin de ne plus dépendre du client TCP de la mainWindow, j'ai créé une classe TCP qui me permet :

            • De lancer un serveur,
            • De lancer un client,
            • Poser la question à mon service (via le client),
            • Gérer un événement sur la réponse du serveur (Mon service),
            • Fermer le client et le serveur.
            Cette classe fonctionne. (Ce qui au passage me rassure un peu sur ma non nullité ^^)

            Voici donc le code de ma page "AdressageDirect" :

            using IP_App.Models;
            using IP_App.ViewModels;
            using IP_Lib;
            using System.Collections.Generic;
            using System.Collections.ObjectModel;
            using System.Windows;
            using System.Windows.Controls;
            
            namespace IP_App
            {
                /// <summary>
                /// Logique d'interaction pour AdressageDirect.xaml
                /// </summary>
                public partial class AdressageDirect : Page
                {
                    public string Sel_Combo { get; set; }
            
                    //public static ObservableCollection<string> ListCB { get; set; }
            
                    private TCP TCP_CS;
                    private ObservableCollection<Interface> list;
                    private InterfacesModel IM = new InterfacesModel();
            
                    public AdressageDirect()
                    {
                        InitializeComponent();
                        list = new ObservableCollection<Interface>();
                        CB_Interface.ItemsSource = list;
                        this.DataContext = this;
                    }
            
                    private void BT_Refresh_Click(object sender, RoutedEventArgs e)
                    {
                        DemandeInterface();
                    }
            
                    private void Page_Loaded(object sender, RoutedEventArgs e)
                    {
                        DemandeInterface();
                    }
            
                    private void TCP_CS_ReponseServeur(object sender, List<string> e)
                    {
                        MainWindow.EnregistrementInterfaces(e);
                        list = new ObservableCollection<Interface>(IM.GetInterfaces());
                        TCP_CS.FinThread();
                    }
            
                    private void DemandeInterface()
                    {
                        TCP_CS = new TCP(MainWindow.ipAddress, MainWindow.PORTLIST, MainWindow.PORTCLIENT);
                        TCP_CS.ReponseServeur += TCP_CS_ReponseServeur;
            
                        List<string> temp = new List<string>();
                        temp.Add(IP_CL.DEMANDE);
                        temp.Add(IP_CL.DEMANDE_LIST_INTERF);
            
                        TCP_CS.Emission(MainWindow.ListToString(temp, IP_CL.SEP_OCC));
                    }
                }
            }
            

            Mais la ComboBox, reste toujours vide.

            Aucune erreur de liaison indiqué en debug.

            Je ne comprends pas pourquoi cela ne fonctionne pas. Comme dans mes précédents tests, ma List en Debug contient bien 7 éléments mais ils ne s'affichent jamais.

            Merci pour ton aide et bon dimanche :)

            EDIT :

            En rédigeant mon précédent message, je me rends compte que la classe TCP ne devrait surement pas être directement sur la page, mais plutôt dans la méthode "DemandeInterface" de mon viewModel ?

            Ai-je raison ?





            -
            Edité par -=DarkNight=- 11 février 2024 à 11:57:08

            • Partager sur Facebook
            • Partager sur Twitter
            Patience et longueur de temps Font plus que force ni que rage.
              11 février 2024 à 15:30:51

              J'ai pas l'impression de voir un MVVM.

              C'est quoi de Modèle ici ?

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                18 mars 2024 à 9:38:02

                Hello, tu n'a pas d'erreurs de binding tout simplement car tu n'as rien bindé.

                Pour remplir une ComboBox, il te faut un binding sur la propriété ItemSource (soit une collection d'Interface dans ton cas).

                La propriété SelectedItem te permet d'initialiser l'item sélectionné dans la combo mais ne marche que s'il y a des items (sinon = -1).

                Ensuite, l'autre condition, c'est de faire un attribut privé et une propriété publique : ce mécanisme te permettra d'implémenter l'événement RaisePropertyChanged impératif pour mettre à jour automatiquement une vue lorsque l'objet avec lequel elle est bindée change de valeur. Tu peux te passer de ce mécanisme à l'unique condition que ta collection soit entièrement initialisée lors de la construction de la vue (j'ai pas lu tout ton code mais j'en doute).

                • Partager sur Facebook
                • Partager sur Twitter

                Meilleur option application WPF + Service Windows

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                • Editeur
                • Markdown