2017-02-20 2 views
1

Okay, bevor Sie irgendetwas sagen, ich kenne mehrere Beiträge von diesem existieren und ich suche nach einer Antwort für Stunden. Ich bin ein neuer Benutzer in Stack Overflow und ziemlich neu in C# und UWP, also zögern Sie nicht, mich zu korrigieren.PropertyChanged ist Null UWP

Ich mache eine UWP Store-Anwendung für Windows 10. Ich benutze eine API und ich verbinde mich mit einem Server. All dies geschieht in einer separaten Seite meiner MainPage.xaml, die in einem Frame geladen wird!

Was ich tun möchte, ist die string connectionStatus zum MainPage.xaml (durch eine <TextBlock/>) zu zeigen, während es in meinem LoginPage.xaml.cs verändert (die innerhalb des MainPage.xaml Rahmen ist). Ich benutze INotifyPropertyChanged. Wenn einer von denen keinen Sinn macht, schreibe bitte einen Kommentar und ich werde versuchen zu antworten.

So habe ich in meinem MainPage.xaml diesen Code für die Bindung und die <Page.DataContext> für die NotifyChanges Klasse (die in meinem LoginPage.xaml.cs ist).

<Page.DataContext> 
    <local:NotifyChanges/> 
</Page.DataContext> 

<TextBlock Text="{Binding ConnectionStatus, Mode=OneWay}" Margin="0,0,10,0" Foreground="LimeGreen" FontWeight="Bold" VerticalAlignment="Center" HorizontalAlignment="Right" FontSize="18"/> 

Und hier ist meine NotifyChanges Klasse, die in meinem LoginPage.xaml.cs ist, die in einem Frame in meinem geladen MainPage.xaml:

public class NotifyChanges : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    // This method is called by the Set accessor of each property. 
    // The CallerMemberName attribute that is applied to the optional propertyName 
    // parameter causes the property name of the caller to be substituted as an argument. 
    private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    private string connectionStatus = "Disconnected"; 

    public string ConnectionStatus 
    { 
     get 
     { 
      return connectionStatus; 
     } 

     set 
     { 
      if (value != connectionStatus) 
      { 
       connectionStatus = value; 
       NotifyPropertyChanged("ConnectionStatus"); 
      } 
     } 
    } 
} 

Last but not least, hier ist mein Code, der die connectionStatus in zwei Änderungen verschiedene Orte, während der Verbindung und nach der Verbindung.

public async Task Run() 
{ 
    NotifyChanges notifyChanges = new NotifyChanges(); 

    try 
    { 
     userToken = TokenTextBox.Text; 

     await client.LoginAsync(TokenType.User, userToken); 

     var connect = client.ConnectAsync(); 

     notifyChanges.ConnectionStatus = client.ConnectionState.ToString(); 

     await connect; 

     notifyChanges.ConnectionStatus = client.ConnectionState.ToString(); 

     Frame.Navigate(typeof(ChatPage), userToken); 

     // Block this task until the program is exited. 
     await Task.Delay(-1); 
    } 
    catch 
    { 
     ConnectionErrorTextBlock.Text = "Something went wrong :/ You may want to check the token again!"; 
    } 
} 

Hinweise: Die Bindung scheint da zu arbeiten, wie Sie sehen, kann ich den Standardwert eingestellt haben, dass „disconected“ und es wird festgelegt, aber nach, dass es ändert sich nie wieder. Ich habe das Programm debuggt und die App geht in die NotifyChanges-Definition, aber es führt nie das Ereignis notify, weil PropertyChanged nie von Null ändert. Fehle ich etwas? Ist mein Fehler woanders? Danke im Voraus!

Antwort

1

Ja, Sie sind etwas fehlt - das Stück Code:

<Page.DataContext> 
    <local:NotifyChanges/> 
</Page.DataContext> 

und diese:

NotifyChanges notifyChanges = new NotifyChanges(); 

zwei verschiedene Referenzen erstellen. Wenn Sie mit der Bindung arbeiten, möchten Sie an derselben Referenz der Klasse arbeiten. Wenn sich Ihre Run()-Methode auf derselben Seite befindet, funktioniert das möglicherweise folgendermaßen:

+0

Es funktioniert. Danke mann. Habe das stundenlang versucht. Könnten Sie bitte erklären, warum das passiert? Der this.DataContext zeigt auf dieselbe Seite, die Login.xaml.cs ist. Die Bindung erfolgt auf der Seite MainPage. Wie funktioniert das ? Vielen Dank! – KonKarapas

+0

@KonKarapas Die Bindung bezieht sich nur auf eine Klasse von DataContext, die in Ihrem Fall in xaml erstellt wurde. In Ihrer Lösung haben Sie in der Methode "Ausführen" eine völlig neue Referenz erstellt, die Sie dann geändert haben, aber nicht die aus dem Datenkontext. Die Benutzeroberfläche ist an die in xaml erstellte Benutzerschnittstelle gebunden. – Romasz

+0

@KonKarapas Beachten Sie, dass Sie auch * NotifyChanges * im Seitenkonstruktor einer geeigneten Eigenschaft zuweisen können, dann setzen Sie 'this.DataContext = propertyNotifyChanges;' - dann haben Sie eine Eigenschaft im Code, die Sie ohne Casting/Creating leicht ändern können (nicht nötig) um DataContext in xaml zu setzen).Sie können auch 'x: Bind' verwenden, ohne * DataContext * zu setzen, aber es ist eine andere Geschichte - es gibt viele Blogs/Posts darüber. – Romasz

Verwandte Themen