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
好的,在您说什么之前,我知道存在多篇这样的帖子,我正在寻找几个小时的答案。我是 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