Stellen Sie eine Frage
Schnellzugriff
- Forenhomepage
- Teilnehmer suchen
- FAQ
Ähnliche Threads durchsuchen
- Remove From My Forums
Benutzer mit den meisten Antworten
Frameworks
>
Windows Presentation Foundation (WPF)
Frage
-
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
- 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
- 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
-
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