我正在制作WPF应用程序,并且我希望在更改变量值时更改文本框中的文本,但是,尽管我正确设置了变量,但无法获取它来更新文本框。
我上了这个课:
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));
}
}
在该课程中被叫来的人
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中的控制台打印将打印该值,但是顶部的控制台打印将打印任何值。我知道最大的值是在调用控制台打印后设置的任何内容都不会打印(因此它尚不包含值),但是我该如何更新它以便窗口打印新值,我该怎么做?让它连续循环遍历User()而不打开新窗口,而只是更新值?
答案 0 :(得分:2)
您发送了不正确的通知:
get { return username;} set { username= value; OnPropertyChanged(nameof(nameuser)); }
您应该发送的不是nameuser,而是nameof(nameuser)。
对于初始用户名,请将其传递给User类:
public User(string username)
{
objsettings = new UserSettings();
objsettings.nameuser = username;
DataContext = objsettings;
InitializeComponent();
Console.WriteLine("objsettings.username1: " + objsettings.nameuser);
}
答案 1 :(得分:0)
您发送了不正确的通知。您应该发送nameof(属性名称)而不是属性值。
此外,为了提高性能,如果属性值没有变化,我们不会发送通知:
public string nameuser
{
get {
return username;
}
set {
if(username == value)
{
return;
}
username= value;
OnPropertyChanged(nameof(nameuser));
}
}
答案 2 :(得分:0)
OnPropertyChanged
方法要求属性名称为字符串。在您的情况下,因为nameuser
也是字符串类型,所以代码可以编译。但实际上,您只是在告诉UI监听名称与nameuser
的值相同的属性中的更改。
将其更改为正确的属性名称,例如OnPropertyChanged("nameuser")
,将获得所需的结果。
在C#版本6中,您还可以使用nameof
功能,因为它可以确保代码OnPropertyChange(nameof(IsBarNull));
中没有魔术字符串