PropertyChanged是Null UWP

时间:2017-02-20 22:00:34

标签: .net data-binding uwp inotifypropertychanged uwp-xaml

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

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

我想要做的是在string connectionStatusMainPage.xaml中更改<TextBlock/>LoginPage.xaml.cs MainPage.xaml显示INotifyPropertyChanged {1}}框架)。我正在使用MainPage.xaml。 如果其中任何一个没有意义,请写评论,我会尝试回答。

因此,我的<Page.DataContext>此代码中包含绑定,NotifyChanges代表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

以下是LoginPage.xaml.cs我的Frame课程,该课程已加载到我MainPage.xaml的{​​{1}}内:

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

备注: 绑定似乎有效,因为您可以看到我已将默认值设置为&#34; Disconected&#34;并且它被设置,但之后它再也不会改变。 我调试了程序,应用程序进入NotifyChanges定义,但它从不执行notify事件,因为PropertyChanged永远不会从Null更改。 我错过了什么吗?我的错误在别处吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

是的,你遗失了一些东西 - 这段代码:

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

和这一个:

NotifyChanges notifyChanges = new NotifyChanges();

创建两个不同的引用。使用绑定时,您希望处理该类的同一个引用。如果您的Run()方法位于同一页面,则可能有效:

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