PropertyChanged 为空 UWP

PropertyChanged is Null UWP

好的,在您说什么之前,我知道存在多篇这样的帖子,我正在寻找几个小时的答案。我是 Stack Overflow 的新用户,对 C# 和 UWP 还很陌生,所以请随时纠正我。

我正在为 Windows 10 创建一个 UWP 商店应用程序。 我使用 API 并连接到服务器。 所有这些都发生在我的 MainPage.xaml 的单独页面中,该页面加载在 Frame!

我想做的是在我的LoginPage.xaml.cs(在里面MainPage.xaml 帧)。我正在使用 INotifyPropertyChanged。 如果其中任何一个没有意义,请发表评论,我会尽力回答。

所以我的 MainPage.xaml 中有这个绑定代码和 NotifyChanges class 中的 <Page.DataContext>(在我的 LoginPage.xaml.cs 中) .

<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"/>

这是我的 NotifyChanges class,它在我的 LoginPage.xaml.cs 中,它被加载到我的 MainPage.xaml 中的 Frame 中:

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");
            }
        }
    }
}

最后但同样重要的是,这是我的代码,它在连接时和连接后两个不同的地方更改 connectionStatus

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!";
    }
}

备注: 绑定似乎有效,因为如您所见,我已将默认值设置为 "Disconected" 并且已设置,但此后它再也不会更改。 我已经调试了程序并且应用程序进入了 NotifyChanges 定义,但它从不执行通知事件,因为 PropertyChanged 从不从 Null 更改。 我错过了什么吗?我的错误在别处吗?提前致谢!

是的,您遗漏了一些东西 - 这段代码:

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

还有这个:

NotifyChanges notifyChanges = new NotifyChanges();

创建两个不同的引用。使用绑定时,您希望处理 class 的同一个引用。如果您的 Run() 方法在同一页面中,这可能有效:

public async Task Run()
{
    NotifyChanges notifyChanges = this.DataContext as NotifyChanges;
    // rest of the code