2017-09-16 1 views
0

Ich versuche, senden Sie den Wert einer Variablen in einem Projekt zu ändern:kann nicht einen aktualisierten Wert der Variablen von einem Projekt zum anderen in der gleichen Lösung

public string test; 
public void Test (string _result) 
{ 
    test = _result; 
    //here i want to update the value of my variable 
} 
//Below there is a condition from one of my methods 
if (result == 0) 
{ 
    Test(_client.ErrorText(result)); 
} 

Jetzt möchte ich dies erhalten möchten Variable in xaml.cs:

private void AddString (object sender, RoutedEventArgs e) 
{ 
    _test = test  
    ListBox.Items.Add(_test);   
} 

Als Ergebnis das Programm nur den Standardwert meiner Variable auf die List-Box hinzu. Später, auch wenn das Varaiable in der Test() -Methode geändert wurde, ist der zur ListBox hinzugefügte Wert immer noch derselbe. Irgendwelche Ideen?

Antwort

0

Ja, das ist perfekt erwartetes Verhalten. Da test nichts anderes als ein gewöhnliches CLR-Feld ist, benachrichtigt es WPF oder irgendeine andere GUI nicht über Änderungen, die zu einem bestimmten Zeitpunkt stattfanden. Ich nehme an, Sie möchten es richtig machen? In diesem Fall müssen Sie einen Großteil Ihres Codes neu schreiben. 1) Implementieren Sie INotifyPropertyChanged in das Interface Ihrer Klasse. So sieht es aus wie public class YourClass : INotifyPropertyChanged. 2) Konvertieren Sie Ihr String-Feld in die Eigenschaft string und heben Sie das PropertyChanged-Ereignis in einer Setter-Methode an. Betrachten Sie folgenden Grund auf:

public string Test { 
    get { return _test; } 
    set { 
     _test = value; 
     PropertyChanged?.Invoke(...); 
    } 
} 

Die letzte Zeile in der Setter wird WPF informieren über Änderungen an der angegebenen Eigenschaft happed und es wird automatisch in die Benutzeroberfläche aktualisiert werden. 3) Letzter Schritt. WPF bietet eine umfassende Bindungsumgebung. Nehmen wir an, Sie haben einen TextBlock, der den Inhalt der Test Eigenschaft darstellen soll. Dann muss es irgendwie ähnlich sein: <TextBlock Text="{Binding Test}" />. Bitte beachten Sie, dass die Bindung nicht funktioniert, es sei denn, die TextBlock 's oder irgendeines Elternteils hat nicht null DataContext Eigenschaft. Es gibt viele Möglichkeiten, es zu vergeben, aber der Einfachheit halber, ich nehme an, Sie es in Ihrem Fenster tun werden (sehr sehr Wurzelelement) Konstruktor:

InitializeComponent(); 
DataContext = new MyClass(); 

Das ist es.

+0

Ich bin nicht sicher, dass dies das Problem ist, da er bereits Listbox.Items.add – sTrenat

+0

Ich habe Änderungen nach Ihren Vorschlägen gemacht und es funktioniert gut. Vielen Dank – BonnRon

Verwandte Themen