Problem mit Data-Binding C# WPF Textbox (2023)

Stellen Sie eine Frage

Ähnliche Threads durchsuchen

  • Remove From My Forums

Benutzer mit den meisten Antworten

Frameworks

>

Windows Presentation Foundation (WPF)

  • Frage

  • Problem mit Data-Binding C# WPF Textbox (1)

    Anmelden

    Hallo,

    ich bin ein absolut ungelernter Programmierneuling/Autodidakt und entschuldige mich im Vorraus für schlechte Formulierungen. Mein Problem ist folgendes:

    In meiner Programmierung soll die Model-View-Control-Architektur eingehalten werden. Da ich in WPF programmiere, bin ich kürzlich auf die Möglichkeit des Data-Binding gestoßen. In meinem Model existiert eine Liste mit Variablen und zugehörigen Werten, die sowohl durch öffnen einer Xml-Datei geändert werden und ihren Inhalt dann auf der GUI in TextBoxen anzeigen soll, als auch wiederum überschrieben werden können, durch Eingabe von Werten in die TextBox.

    Hier der Code für die Variable

     //Der Name der Klasse in meinem namespace public class AktuelleGUIWerte : INotifyPropertyChanged {//Die Variable, die in der Textbox angezeigt werden soll mit Getter und Setter private string _Melt_Contour_Outer_Offset_Offset_AMF = ""; public string Melt_Contour_Outer_Offset_Offset_AMF { get { return _Melt_Contour_Outer_Offset_Offset_AMF; } set { _Melt_Contour_Outer_Offset_Offset_AMF = value; OnPropertyChanged("Melt_Contour_Outer_Offset_Offset_AMF"); } } //Der zugehörige Eventhandler public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }

    In meiner Klasse Model wird der Wert der Variablen beim öffnen der XML-Datei überschrieben:

    //Diese Methode beinhaltet alle benötigten Routinen, die beim Öffnen einer XML-Datei durchlaufen werden müssen internal void AMF_oeffnen() { FileImport(); foreach (ProzessParameter p in prozessParas) { p.Erase_amf_wert(); } AMF_Inhalt_extrahieren();//Hier wird die Methode zum Überschreiben der Variablen aufgerufen GUIaktualisieren(); }//Diese Methode Überschreibt den Wert public void GUIaktualisieren() { aktuelleGUIwerte.Melt_Contour_Outer_Offset_Offset_AMF = ProzessParameterSuchen("Melt_Contour_Outer_Offset_Offset").Get_letztenAMFWert().Get_inhalt_AMFWert(); }

    So sieht der zugehörige Code-Schnipsel in der View_Control aus, der die GUI verwaltet

     public partial class View_Control : Window { Model model;//Konstruktor, das Model wird initialisiert public View_Control() { InitializeComponent(); model = new Model(); } //Hier wird die Öffnenmethode aus dem Model aufgerufen private void amf_open_click(object sender, RoutedEventArgs e) { model.AMF_oeffnen(); }

    In der XAML hier noch der zugehörige Code für die Textbox. Zur besseren Übersichtlichkeit habe ich versucht, alle irrelevanten Pfade zu schließen und die relevanten bold gestellt.

    <Window x:Class="Test_2018_08_27.View_Control" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Test_2018_08_27" mc:Ignorable="d" Title="Test" Height="797.676" Width="882.954"> <Window.Resources> <local:AktuelleGUIWerte x:Key="aktuellerGUIWert"/> </Window.Resources> <Grid DataContext="{Binding Source={StaticResource aktuellerGUIWert}}"> <Menu HorizontalAlignment="Left" Height="28" VerticalAlignment="Top" Width="875"> </Menu>

    <TreeView HorizontalAlignment="Left" Height="725" Margin="10,33,0,0" VerticalAlignment="Top" Width="212"> </TreeView>

    <GroupBox x:Name="gb_allgemein" Header="Allgemein" HorizontalAlignment="Left" Height="520" Margin="232,23,0,0" VerticalAlignment="Top" Width="285" Visibility="Hidden"> </GroupBox> <GroupBox x:Name="gb_poweranalyse" Header="Power Analyse" HorizontalAlignment="Left" Height="520" Margin="232,23,0,0" VerticalAlignment="Top" Width="285" Visibility="Hidden"/> <GroupBox x:Name="gb_contourouter" Header="Outer" HorizontalAlignment="Left" Height="735" Margin="232,23,0,0" VerticalAlignment="Top" Width="313" FontSize="15" Visibility="Hidden"> <Grid HorizontalAlignment="Left" Height="595" Margin="10,10,-2,0" VerticalAlignment="Top" Width="293"> <GroupBox x:Name="gb_gb_contourouter_offset" Header="Offset" HorizontalAlignment="Left" Height="52" Margin="10,0,0,0" VerticalAlignment="Top" Width="273" FontSize="12" FontWeight="Bold"> <Grid HorizontalAlignment="Left" Height="22" Margin="4,3,-2,0" VerticalAlignment="Top" Width="259"> <Label Content="Offset" HorizontalAlignment="Left" Margin="10,2,0,0" VerticalAlignment="Top" Width="75" FontSize="12" Height="20" Padding="5,0,5,5" FontWeight="Normal"/> <TextBox x:Name="tb_outer_offset_offset" Text="{Binding Melt_Contour_Outer_Offset_Offset_AMF, Mode=TwoWay}" HorizontalAlignment="Left" Height="20" Margin="150,2,0,0" TextWrapping="Wrap" TextAlignment="Right" VerticalAlignment="Top" Width="53" BorderThickness="0.5" FontSize="12" Padding="5,0,5,5" FontWeight="Normal" Background="{x:Null}"/> </Grid> </GroupBox>


    Mein Problem ist jetzt, dass zwar die Variable Melt_Contour_Outer_Offset_Offset_AMF in der Programmierung den richtigen Wert annimmt, dieser aber beim laden der Xml-Datei nicht in die TextBox geschrieben wird. Gebe ich aber einen Wert in die TextBox ein, ändert sich der Wert der Variablen wie gewünscht. Also, eine Richtung geht, die andere nicht. Warum? Habe ich das Konzept des Data-Binding falsch verstanden? Oder sehe ich einfach den Fehler vor lauter Programmiertext nicht?

    Über Hilfe würde ich mich sehr freuen, gern liefere ich noch weitere Informationen oder beantworte Fragen, sollte meine Formulierung nicht aussagekräftig genug sein.

    Danke

    Karla

    Dienstag, 28. August 2018 11:25

    Antworten

    |

    Zitieren

Antworten

  • Problem mit Data-Binding C# WPF Textbox (3)

    4

    Anmelden

    Hi Karla,
    bei mir funktioniert Dein Code, nachdem ich auch den Verweis im Model auf dieAktuelleGUIWerte gesetzt habe. Vermutlich wird in Deinem Code diese Zuweisung so gemacht, dass vermutlich zwei verschiedene Instanzen vonAktuelleGUIWerte existieren. Hier meine Demo:

    XAML:

    <Window x:Class="Test_2018_08_27.View_Control" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Test_2018_08_27" mc:Ignorable="d" Title="View_Control" Height="450" Width="800"> <Window.Resources> <local:AktuelleGUIWerte x:Key="aktuellerGUIWert"/> </Window.Resources> <Grid DataContext="{Binding Source={StaticResource aktuellerGUIWert}}"> <Button Content="Test" HorizontalAlignment="Left" Height="50" VerticalAlignment="Top" Click="amf_open_click"/> <GroupBox x:Name="gb_contourouter" Header="Outer" HorizontalAlignment="Left" Height="735" Margin="232,23,0,0" VerticalAlignment="Top" Width="313" FontSize="15" Visibility="Visible"> <Grid HorizontalAlignment="Left" Height="595" Margin="10,10,-2,0" VerticalAlignment="Top" Width="293"> <GroupBox x:Name="gb_gb_contourouter_offset" Header="Offset" HorizontalAlignment="Left" Height="52" Margin="10,0,0,0" VerticalAlignment="Top" Width="273" FontSize="12" FontWeight="Bold"> <Grid HorizontalAlignment="Left" Height="22" Margin="4,3,-2,0" VerticalAlignment="Top" Width="259"> <Label Content="Offset" HorizontalAlignment="Left" Margin="10,2,0,0" VerticalAlignment="Top" Width="75" FontSize="12" Height="20" Padding="5,0,5,5" FontWeight="Normal"/> <TextBox x:Name="tb_outer_offset_offset" Text="{Binding Melt_Contour_Outer_Offset_Offset_AMF, Mode=TwoWay}" HorizontalAlignment="Left" Height="20" Margin="150,2,0,0" TextWrapping="Wrap" TextAlignment="Right" VerticalAlignment="Top" Width="80" BorderThickness="0.5" FontSize="12" Padding="5,0,5,5" FontWeight="Normal" Background="{x:Null}"/> </Grid> </GroupBox> </Grid> </GroupBox> </Grid></Window>

    Und dazu der Testcode:

    using System;using System.ComponentModel;using System.Windows;namespace Test_2018_08_27{ /// <summary> /// Interaction logic for View_Control.xaml /// </summary> public partial class View_Control : Window { //Konstruktor, das Model wird initialisiert public View_Control() { InitializeComponent(); model = new Model(); model.aktuelleGUIwerte = (AktuelleGUIWerte)this.Resources["aktuellerGUIWert"]; } Model model; //Hier wird die Öffnenmethode aus dem Model aufgerufen private void amf_open_click(object sender, RoutedEventArgs e) => model.AMF_oeffnen(); } //Der Name der Klasse in meinem namespace public class AktuelleGUIWerte : INotifyPropertyChanged { //Die Variable, die in der Textbox angezeigt werden soll mit Getter und Setter private string _Melt_Contour_Outer_Offset_Offset_AMF = ""; public string Melt_Contour_Outer_Offset_Offset_AMF { get { return _Melt_Contour_Outer_Offset_Offset_AMF; } set { _Melt_Contour_Outer_Offset_Offset_AMF = value; OnPropertyChanged("Melt_Contour_Outer_Offset_Offset_AMF"); } } //Der zugehörige Eventhandler public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public class Model { public AktuelleGUIWerte aktuelleGUIwerte { get; set; } //Diese Methode beinhaltet alle benötigten Routinen, die beim Öffnen einer XML-Datei durchlaufen werden müssen internal void AMF_oeffnen() { //Hier wird die Methode zum Überschreiben der Variablen aufgerufen GUIaktualisieren(); } //Diese Methode Überschreibt den Wert public void GUIaktualisieren() => aktuelleGUIwerte.Melt_Contour_Outer_Offset_Offset_AMF = DateTime.Now.ToLongTimeString(); }}

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert snapinator Dienstag, 28. August 2018 19:24

    Dienstag, 28. August 2018 18:47

    Antworten

    |

    Zitieren

Alle Antworten

  • Problem mit Data-Binding C# WPF Textbox (5)

    4

    Anmelden

    Hi Karla,
    bei mir funktioniert Dein Code, nachdem ich auch den Verweis im Model auf dieAktuelleGUIWerte gesetzt habe. Vermutlich wird in Deinem Code diese Zuweisung so gemacht, dass vermutlich zwei verschiedene Instanzen vonAktuelleGUIWerte existieren. Hier meine Demo:

    XAML:

    <Window x:Class="Test_2018_08_27.View_Control" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Test_2018_08_27" mc:Ignorable="d" Title="View_Control" Height="450" Width="800"> <Window.Resources> <local:AktuelleGUIWerte x:Key="aktuellerGUIWert"/> </Window.Resources> <Grid DataContext="{Binding Source={StaticResource aktuellerGUIWert}}"> <Button Content="Test" HorizontalAlignment="Left" Height="50" VerticalAlignment="Top" Click="amf_open_click"/> <GroupBox x:Name="gb_contourouter" Header="Outer" HorizontalAlignment="Left" Height="735" Margin="232,23,0,0" VerticalAlignment="Top" Width="313" FontSize="15" Visibility="Visible"> <Grid HorizontalAlignment="Left" Height="595" Margin="10,10,-2,0" VerticalAlignment="Top" Width="293"> <GroupBox x:Name="gb_gb_contourouter_offset" Header="Offset" HorizontalAlignment="Left" Height="52" Margin="10,0,0,0" VerticalAlignment="Top" Width="273" FontSize="12" FontWeight="Bold"> <Grid HorizontalAlignment="Left" Height="22" Margin="4,3,-2,0" VerticalAlignment="Top" Width="259"> <Label Content="Offset" HorizontalAlignment="Left" Margin="10,2,0,0" VerticalAlignment="Top" Width="75" FontSize="12" Height="20" Padding="5,0,5,5" FontWeight="Normal"/> <TextBox x:Name="tb_outer_offset_offset" Text="{Binding Melt_Contour_Outer_Offset_Offset_AMF, Mode=TwoWay}" HorizontalAlignment="Left" Height="20" Margin="150,2,0,0" TextWrapping="Wrap" TextAlignment="Right" VerticalAlignment="Top" Width="80" BorderThickness="0.5" FontSize="12" Padding="5,0,5,5" FontWeight="Normal" Background="{x:Null}"/> </Grid> </GroupBox> </Grid> </GroupBox> </Grid></Window>

    Und dazu der Testcode:

    using System;using System.ComponentModel;using System.Windows;namespace Test_2018_08_27{ /// <summary> /// Interaction logic for View_Control.xaml /// </summary> public partial class View_Control : Window { //Konstruktor, das Model wird initialisiert public View_Control() { InitializeComponent(); model = new Model(); model.aktuelleGUIwerte = (AktuelleGUIWerte)this.Resources["aktuellerGUIWert"]; } Model model; //Hier wird die Öffnenmethode aus dem Model aufgerufen private void amf_open_click(object sender, RoutedEventArgs e) => model.AMF_oeffnen(); } //Der Name der Klasse in meinem namespace public class AktuelleGUIWerte : INotifyPropertyChanged { //Die Variable, die in der Textbox angezeigt werden soll mit Getter und Setter private string _Melt_Contour_Outer_Offset_Offset_AMF = ""; public string Melt_Contour_Outer_Offset_Offset_AMF { get { return _Melt_Contour_Outer_Offset_Offset_AMF; } set { _Melt_Contour_Outer_Offset_Offset_AMF = value; OnPropertyChanged("Melt_Contour_Outer_Offset_Offset_AMF"); } } //Der zugehörige Eventhandler public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public class Model { public AktuelleGUIWerte aktuelleGUIwerte { get; set; } //Diese Methode beinhaltet alle benötigten Routinen, die beim Öffnen einer XML-Datei durchlaufen werden müssen internal void AMF_oeffnen() { //Hier wird die Methode zum Überschreiben der Variablen aufgerufen GUIaktualisieren(); } //Diese Methode Überschreibt den Wert public void GUIaktualisieren() => aktuelleGUIwerte.Melt_Contour_Outer_Offset_Offset_AMF = DateTime.Now.ToLongTimeString(); }}

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert snapinator Dienstag, 28. August 2018 19:24

    Dienstag, 28. August 2018 18:47

    Antworten

    |

    Zitieren

  • Problem mit Data-Binding C# WPF Textbox (7)

    Anmelden

    Hallo Peter,

    vielen lieben Dank für die ausführliche Hilfe!! Jetzt funktioniert alles.

    Einen schönen Abend wünsche ich!

    Viele Grüße

    Karla

    Dienstag, 28. August 2018 19:26

    Antworten

    |

    Zitieren

Top Articles
Latest Posts
Article information

Author: Greg O'Connell

Last Updated: 11/15/2022

Views: 5925

Rating: 4.1 / 5 (42 voted)

Reviews: 89% of readers found this page helpful

Author information

Name: Greg O'Connell

Birthday: 1992-01-10

Address: Suite 517 2436 Jefferey Pass, Shanitaside, UT 27519

Phone: +2614651609714

Job: Education Developer

Hobby: Cooking, Gambling, Pottery, Shooting, Baseball, Singing, Snowboarding

Introduction: My name is Greg O'Connell, I am a delightful, colorful, talented, kind, lively, modern, tender person who loves writing and wants to share my knowledge and understanding with you.