Переменная не сохраняет значение между методами c # - PullRequest
0 голосов
/ 25 сентября 2018

Я делаю приложение 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 (), не открывая новые окна, а просто обновляя значения?

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Вы отправили неверное уведомление.Вы должны отправить nameof (имя свойства) вместо значения свойства.

Кроме того, чтобы повысить производительность, мы не отправляем уведомления, если значение свойства не изменилось:

public string nameuser
{
    get { 
         return username;
        } 

    set { 
         if(username == value)
         {
             return;
         }

         username= value; 
         OnPropertyChanged(nameof(nameuser));
        }
}
0 голосов
/ 25 сентября 2018

OnPropertyChanged метод ожидает имя свойства в виде строки.В вашем случае код компилируется, поскольку nameuser также имеет тип string.Но, по сути, вы просто говорите пользовательскому интерфейсу прислушиваться к изменениям в свойстве, имя которого совпадает со значением nameuser.

Если изменить его на правильное имя свойства как OnPropertyChanged("nameuser"), вы получите желаемые результаты.

В C # версии 6 вы также можете использовать функцию nameof, поскольку она гарантирует, что в коде нет волшебных строк OnPropertyChange(nameof(IsBarNull));

0 голосов
/ 25 сентября 2018

Вы отправляете неверное уведомление:

 get { return username;} set { username= value; OnPropertyChanged(nameof(nameuser)); }

Вы должны отправить не nameuser, а nameof (nameuser).

Что касается начального имени пользователя, передайте его классу пользователя:

public User(string username)
    {

        objsettings = new UserSettings();
        objsettings.nameuser = username;
        DataContext = objsettings; 
        InitializeComponent();
        Console.WriteLine("objsettings.username1: " + objsettings.nameuser);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...