变量不保留方法 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));