变量不能在方法c#

时间:2018-09-25 02:42:32

标签: c# wpf data-binding textbox

我正在制作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 :(得分: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));中没有魔术字符串