Hallo zusammen,
ich habe eine WPF-Anwendung in C# geschrieben. Hierbei habe ich verschiedene Seiten erstellt, wobei auf der ersten Seite der Benutzer bestimmte Werte eingibt sowie einige Inhalte automatisch ausgefüllt werden. Sobald alle Eingaben getroffen wurden, wird über einen Button "Berechnen" eine Berechnung auf den anderen Seiten durchgeführt und der Benutzer wird automatisch zur nächsten Seite weiter geleitet. Die Werte werden über eine extra Klasse namens "Datenspeicher" gespeichert und an die weiteren Seiten übergeben, wo ich dann auf die Inhalte zugreifen kann.
Wenn ich nun zurückkehre zur ersten Eingabeseite werden leider nicht alle Werte gespeichert und wieder angezeigt, sondern lediglich die Inhalte aus den "einfachen" Textboxen, aber keine Inhalte aus ComboBoxen oder RadioButtons.
Hierbei werden die Inhalte der Textboxen "LängeBauteil" oder "Stahlpreis" wieder angezeigt, die Inhalte der ComboBoxen "ProfilartGenau" wiederum nicht.
Hier ist der Code der ersten "Eingabeseite", wo ich die Werte speichere:
namespace WpfAppToolBar.Pages
{
public partial class Page1 : Page
{
InitializeComponent();
//Eingegebene Daten bleiben beim Wechseln der Seite bestehen:
#region
if (Datenspeicher.LängeBauteilWert != null)
{
LängeBauteil.Text = Datenspeicher.LängeBauteilWert;
}
if (Datenspeicher.ProfilartIndex >= 0 && Datenspeicher.ProfilartIndex < ProfilartGenau.Items.Count)
{
ProfilartGenau.SelectedIndex = Datenspeicher.ProfilartIndex;
}
if (Datenspeicher.Bauteilart1 != null)
{
Bauteilart.SelectedItem = Datenspeicher.Bauteilart1;
}
if (Datenspeicher.Stahlpreis != null)
{
Stahlpreis.Text = Datenspeicher.Stahlpreis;
}
if (Datenspeicher.Stückzahl != null)
{
Stückzahl.Text = Datenspeicher.Stückzahl;
}
if (Datenspeicher.Gewicht != null)
{
Gewicht.Text = Datenspeicher.Gewicht;
}
if (Datenspeicher.Bauteillänge1 != null)
{
Bauteillänge1.Text = Datenspeicher.Bauteillänge1;
}
if (Datenspeicher.Bauteilbreite2 != null)
{
Bauteilbreite2.Text = Datenspeicher.Bauteilbreite2;
}
if (Datenspeicher.Flanschbreite3 != null)
{
Flanschbreite3.Text = Datenspeicher.Flanschbreite3;
}
if (Datenspeicher.Bauteilhöhe4 != null)
{
Bauteilhöhe4.Text = Datenspeicher.Bauteilhöhe4;
}
if (Datenspeicher.Projektnummer != null)
{
Projektnummer.Text = Datenspeicher.Projektnummer;
}
if (Datenspeicher.Bauvorhaben != null)
{
Bauvorhaben.Text = Datenspeicher.Bauvorhaben;
}
if (Datenspeicher.UmfangBauteil != null)
{
UmfangBauteil.Text = Datenspeicher.UmfangBauteil;
}
#endregion
}
Sowas nennt sich prinzipiell State Management und kann man viel einfacher zB Reactive Extensions oder ReactiveUI lösen.
Ansonsten kannst Du das auch alles mit MVVM Bordmitteln nutzen, musst dann nur achten wann Du wie welches VM initialisierst.
Ansonsten: MVVM richtig anwenden und diese Property-Zuweisungen lassen. Das fällt einem recht schnell auf die Füße, wenn man das nicht macht.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hast du eine Idee wie ich das in meinem Code anwenden könnte? Eigentlich mache ich es ja bereits über MVVM Bordmitteln, wobei es leider nicht das gewünschte Ergebniss liefert...
Ne, Du machst aktuell kein MVVM, weil Du Dich im Code-Behind befindest und selbst Property-Werte zuweist.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Sorry, aber dein Code ist schlecht: UI-Code und Daten(haltung) sollte komplett getrennt sein (und für WPF solltest du - im eigenen Interesse bzw. dem Interesse der Firma - zwingend MVVM benutzen: [Artikel] MVVM und DataBinding und s.a. [Artikel] Drei-Schichten-Architektur).
Ich befürchte, daß auch dein anderer Code so ähnlich aufgebaut ist (und dann ist es mit Wartbarkeit und Wiederverwendbarkeit schlecht bestellt) - Page1.xaml.cs
hat mehr als 4000 Zeilen und anscheinend benutzt du #region
, um Zeilen im Editor auszublenden.
Du solltest die Daten aus Ressourcen laden, anstatt hartverdrahtet im Code (außerdem gibt es code-technisch viel bessere Möglichkeiten, als einzelne list.Add(...)
-Zeilen zu benutzen!).
Ich könnte dir jetzt deinen Fehler beschreiben, aber dann würdest du einfach so weiter machen...
Hab mir den Code angeschaut und muss Th69 sowie Abt beipflichten.
Du arbeitest hier im Grunde komplett an WPF vorbei.
In deiner Page.xaml.cs stehen auch am Ende sämtliche Klassen, die du dort nutzt.
Die .cs Datei ist ein Paradebeispiel wie man es in WPF und auch in C# im allgemeinen nicht macht.
Schau dir die Artikel für "MVVVM und DataBinding" sowie Drei-Schichten-Architektur umbedingt an, damit du dort eine saubere Trennung zwischen Code und UI hinbekommst.
An sonsten bleibt auch der Blick in die Doku von Microsoft selbst immer ein wichtiger Einstiegspunkt in solche Themen.
Diese solltest du neben den Artikeln ebenfalls durchlesen und ggf. mit kleinen Testprojekten erstmal verinnerlichen.
Sonst wirst du bei WPF nicht glücklich und zukünftig nur noch Krücke und Krücke bauen, da du am Grundkonzept vorbei arbeitest.
Doku:
https://learn.microsoft.com/de-de/dotnet/desktop/wpf/getting-started/introduction-to-wpf-in-vs?view=netframeworkdesktop-4.8
https://learn.microsoft.com/de-de/dotnet/desktop/wpf/introduction-to-wpf?view=netframeworkdesktop-4.8
Nachtrag:
Weiterer Kritikpunkt ist auch, dass sich der Aufbau deiner Klasse unnötig wiederholt.
Entweder brauchst du mehr Abstraktion, also einen Basisklasse, oder es reicht eine Klasse für deine Varianten.
Dadurch sparst du vermutlich schon mehr als die Hälfte deiner Klassen aus.
Ebenfalls sind alle Properties in diesen Klasse nur stumpfe Strings.
Die Bezeichnungen wiedersprechend sich auch bzw. gibt es Konstruktore die bool entsprechen.
Dadurch wird der Code nicht nur unklarer, es nutzt auch unnötig mehr Speicher und du umgehst damit das Typsystem komplett.
Entsprechend kann sonst was in den Properties stehen, am Ende musst du dann noch zusätzliche Konvertierungen und Fehlerbehandlungen umsetzen.
Damit machst du dir zusätzlich unnötige Arbeit, die dir das DataBinding mit Eingabevalidierung abnimmt.
Im Code habe ich auch folgende Zeile gefunden:
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
Für mich sieht das ganze aber nicht nach einem nicht kommerziellen Projekt aus bzw. sieht es nach einem Firmeninternen Projekt aus.
Ob dann die Lizenz hier korrekt ist, müsste ebenfalls noch geprüft/geklärt werden!
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.