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);
}
}
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.
Patience et longueur de temps Font plus que force ni que rage.
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
Patience et longueur de temps Font plus que force ni que rage.
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).
Meilleur option application WPF + Service Windows
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.