变量不保留方法 c# 之间的值
Variable not retaining value between methods c#
我正在制作一个 WPF 应用程序,我希望我的文本框中的文本随着我更改变量值而改变,但是,尽管我正确设置了变量,但我无法让它更新文本框。
我有这个class:
public class UserSettings : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string username;
public string nameuser
{
get { return username;} set { username= value; OnPropertyChanged(nameuser); }
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
在这个 class:
中被调用
public partial class User: Window
{
private UserSettings objsettings = null;
public User()
{
objsettings = new UserSettings();
DataContext = objsettings;
InitializeComponent();
Console.WriteLine("objsettings.username1: " + objsettings.nameuser);
}
public void SetUserSettings(string username)
{
Console.WriteLine("Username: " + username);
objsettings.nameuser= username;
Console.WriteLine("objsettings.username2: " + objsettings.nameuser);
}
而 XAML 是:
<TextBox Text="{Binding nameuser, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="210,193,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="30"/>
SetUserSettings 中的控制台打印打印值,但顶部的控制台打印打印值为空。我知道最高值在调用控制台打印后设置时什么也不打印(因此它还不包含值),但是我如何更新它以便 window 打印新值,如何让它在不打开新 windows 的情况下连续循环 User() 而只是更新值?
您发送了错误的通知:
get { return username;} set { username= value; OnPropertyChanged(nameof(nameuser)); }
您不应发送 nameuser,而应发送 nameof(nameuser)。
至于初始用户名将其传递给用户 class:
public User(string username)
{
objsettings = new UserSettings();
objsettings.nameuser = username;
DataContext = objsettings;
InitializeComponent();
Console.WriteLine("objsettings.username1: " + objsettings.nameuser);
}
您发送了错误的通知。您应该发送 nameof(属性 name) 而不是 属性 值。
此外,为了提高性能,如果 属性 值没有变化,我们不会发送通知:
public string nameuser
{
get {
return username;
}
set {
if(username == value)
{
return;
}
username= value;
OnPropertyChanged(nameof(nameuser));
}
}
OnPropertyChanged
方法需要 属性 名称作为字符串。在您的情况下,代码会编译,因为 nameuser
也是字符串类型。但本质上你只是告诉 UI 监听 属性 的变化,其名称与 nameuser
.
的值相同
将其更改为正确的 属性 名称 OnPropertyChanged("nameuser")
,将得到您想要的结果。
在 C# 版本 6 中,您还可以使用 nameof
功能,因为它确保代码中没有魔法字符串 OnPropertyChange(nameof(IsBarNull));
我正在制作一个 WPF 应用程序,我希望我的文本框中的文本随着我更改变量值而改变,但是,尽管我正确设置了变量,但我无法让它更新文本框。
我有这个class:
public class UserSettings : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string username;
public string nameuser
{
get { return username;} set { username= value; OnPropertyChanged(nameuser); }
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
在这个 class:
中被调用 public partial class User: Window
{
private UserSettings objsettings = null;
public User()
{
objsettings = new UserSettings();
DataContext = objsettings;
InitializeComponent();
Console.WriteLine("objsettings.username1: " + objsettings.nameuser);
}
public void SetUserSettings(string username)
{
Console.WriteLine("Username: " + username);
objsettings.nameuser= username;
Console.WriteLine("objsettings.username2: " + objsettings.nameuser);
}
而 XAML 是:
<TextBox Text="{Binding nameuser, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="210,193,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="30"/>
SetUserSettings 中的控制台打印打印值,但顶部的控制台打印打印值为空。我知道最高值在调用控制台打印后设置时什么也不打印(因此它还不包含值),但是我如何更新它以便 window 打印新值,如何让它在不打开新 windows 的情况下连续循环 User() 而只是更新值?
您发送了错误的通知:
get { return username;} set { username= value; OnPropertyChanged(nameof(nameuser)); }
您不应发送 nameuser,而应发送 nameof(nameuser)。
至于初始用户名将其传递给用户 class:
public User(string username)
{
objsettings = new UserSettings();
objsettings.nameuser = username;
DataContext = objsettings;
InitializeComponent();
Console.WriteLine("objsettings.username1: " + objsettings.nameuser);
}
您发送了错误的通知。您应该发送 nameof(属性 name) 而不是 属性 值。
此外,为了提高性能,如果 属性 值没有变化,我们不会发送通知:
public string nameuser
{
get {
return username;
}
set {
if(username == value)
{
return;
}
username= value;
OnPropertyChanged(nameof(nameuser));
}
}
OnPropertyChanged
方法需要 属性 名称作为字符串。在您的情况下,代码会编译,因为 nameuser
也是字符串类型。但本质上你只是告诉 UI 监听 属性 的变化,其名称与 nameuser
.
将其更改为正确的 属性 名称 OnPropertyChanged("nameuser")
,将得到您想要的结果。
在 C# 版本 6 中,您还可以使用 nameof
功能,因为它确保代码中没有魔法字符串 OnPropertyChange(nameof(IsBarNull));