Laden...

Objekt an ein WPF Form übergeben - bleibt jedoch null

Erstellt von mpmic vor einem Jahr Letzter Beitrag vor einem Jahr 474 Views
M
mpmic Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr
Objekt an ein WPF Form übergeben - bleibt jedoch null

Hallo Forum,

ich bin ganz neu hier und grüße Euch herzlich! Ich hoffe Ihr könnt mir helfen - ich vermute es ist ein einfaches Problem, aber da ich auch neu bin in C# für mich ein Rätsel.
Ich habe eine Class SETUP. Im MainWindow wird die Klasse Initalisiert und mit Werten gefüllt. Nun möchte ich ein weiteres Fenster öffnen um die Daten zu ändern. Ich übergebe auch das Objekt (und im MainWindow hat es auch noch Daten) aber im neuen Window (WDSettings) sind alle Werte null.
Hier die entsprechenden Codeausschnitte:

Setup Klasse:


using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.IO;
using Microsoft.Win32;

namespace PFSExplorer
{
    public class Setup
    {
        #region "Properties"

        public string TepmlatePath { get; set; }
        public string MastersPath { get; set; }
        public string OutputPath { get; set; }

        #endregion "Properties"
        }
}

Hier die relevanten Teile aus dem Main Window (Zeile 42-44):


namespace PFSExplorer
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        /// <summary>
        /// Aktuelles Setup
        /// </summary>
        public Setup MySetup = new Setup();

        public MainWindow()
        {
            InitializeComponent();
            Init();
        }

        /// <summary>
        /// Erstes Init - Programmstart
        /// </summary>
        public void Init()
        {
            MySetup.Init();
            MySetup.RgExOrNew();
            MySetup.RgLoad();
            MySetup.Pathcheck();
            LoadMasters();
            LoadTemplates();
        }

        public void LoadMasters()
        {
        }

        public void LoadTemplates()
        {
        }

        private void MN_Config_Click(object sender, RoutedEventArgs e)
        {
            WDSettings wDSettings = new WDSettings();
            wDSettings.CurSetup = MySetup;
            wDSettings.Show();
        }

        private void MN_Main_LoadCfg_Click(object sender, RoutedEventArgs e)
        {
        }

        private void MN_Main_SaveCfg_Click(object sender, RoutedEventArgs e)
        {
        }
    }
}

Und hier das Window, in dem die Werte in CurSetup leer sind:


namespace PFSExplorer
{
    /// <summary>
    /// Interaktionslogik für WDSettings.xaml
    /// </summary>

    public partial class WDSettings : Window
    {
        /// <summary>
        /// Aktuelles Setup, das modifiziert wird
        /// </summary>
        public Setup CurSetup { get; set; }

        private Setup Backup;

        /// <summary>
        /// Maske erfolgreich abgeschlossen - ja / nein
        /// </summary>
        public bool WDResult = false;

        public WDSettings()
        {
            InitializeComponent();
            Backup = CurSetup;
            PathfromBackup();
        }

        private void PathfromBackup()
        {
            TB_TemplPath.Text = Backup.TepmlatePath;
            TB_MasterPath.Text = Backup.TepmlatePath;
            TB_OutputPath.Text = Backup.OutputPath;
        }

        private void ChckChanges()
        {
            bool Changed = false;
            if (Backup.TepmlatePath != TB_TemplPath.Text) { Changed = true; }
            if (Backup.MastersPath != TB_MasterPath.Text) { Changed = true; }
            if (Backup.OutputPath != TB_MasterPath.Text) { Changed = true; }
            if (!Changed) { LA_StatusMsg.Content = "Einstellungen geändert. Speichern nicht vergessen"; }
        }

        private void TB_Path_TextChanged(object sender, TextChangedEventArgs e)
        {
            ChckChanges();
        }

        private void BT_SettingsReset_Click(object sender, RoutedEventArgs e)
        {
            PathfromBackup();
        }

        private void BT_SettingsSave_Click(object sender, RoutedEventArgs e)
        {
            CurSetup.TepmlatePath = TB_TemplPath.Text;
            CurSetup.MastersPath = TB_MasterPath.Text;
            CurSetup.OutputPath = TB_OutputPath.Text;
            CurSetup.RgSave();
            WDResult = true;
            Close();
        }
    }
}

Vielleicht hat jemand ja eine gute Idee dazu...
Vielen Dank
Martin

T
2.219 Beiträge seit 2008
vor einem Jahr

Das liegt daran, dass du MySetup erst nach dem Aufruf des Konstruktor von WDSettings übergibst.
Da du aber im Konstruktor von WDSettings dann CurSetup, was hier noch null ist, dann in Backup speicherst und dann damit arbeiten willst, knallt es.
Du solltest dich erstmal mit den Grundlagen von OOP beschäftigen.
Gerade mit WPF hast du auch einen technischen Ansatz, den du aktuell nicht richtig umsetzt.
Dort arbeitet man nicht mit Code Behind sondern nach dem MVC/MVVM Muster.

Dadurch sind deine aktuellen Prüfungen auf Änderungen nicht nötig, da das Muster Änderungen an das Model selbst melden würde.
Dazu müsstest du aber erstmal die Grundlagen inne haben, damit du das sauber umsetzen kannst!

Nachtrag:
Im einfachsten Fall kanst du das Problem lösen in dem du MySetup an den Konsturktor mitgibst oder deine Verarbeitung nach dem setzen von CurSetup dann in einer public Methode duchführst.

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.

M
mpmic Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr

Hallo T-Virus,

danke! So etwas hatte ich fast schon befürchtet. Ich habe grade erst begonnen und mein alte VB Wissen angesetzt.
Wenn ich dich richtig verstehe, dann müsste ich wohl das WDSettings an die Setupklasse binden und dann mit den Daten arbeiten.
Da muss ich mir dann echt noch einlesen.
Danke
Martin

T
2.219 Beiträge seit 2008
vor einem Jahr

@mpmic
Nein, genau anders herum.
Du gibst MySetup einfach über den Konstruktor an WDSettings mit.


// Übergabe über den Konstruktor
WDSettings wDSettings = new WDSettings(MySetup);

// Konstruktor
 public WDSettings(Setup setup)
{
    InitializeComponent();
    CurSetup = setup;
    Backup = CurSetup;
    PathfromBackup();
}

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.

M
mpmic Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr

Super, vielen Dank! Ich habe das Prinzip verstanden.