C# INotifyPropertyChanged不使用传统绑定,但使用编译绑定

C# INotifyPropertyChanged不使用传统绑定,但使用编译绑定,c#,xaml,data-binding,inotifypropertychanged,uwp,C#,Xaml,Data Binding,Inotifypropertychanged,Uwp,我不知道我是否做错了什么,或者是否缺少了什么,但是INotifyPropertyChanged在我使用编译时绑定时起作用,而在使用传统绑定时不起作用 public class Students : INotifyPropertyChanged { private string name; private string surname; public event PropertyChangedEventHandler PropertyChanged; pri

我不知道我是否做错了什么,或者是否缺少了什么,但是INotifyPropertyChanged在我使用编译时绑定时起作用,而在使用传统绑定时不起作用

public class Students : INotifyPropertyChanged
{

    private string name;
    private string surname;


    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public string Name
    {
        get { return name; }
        set
        {
            if(value != name)
            {
                name = value;
                NotifyPropertyChanged();
            }

        }
    }

    public string Surname
    {
        get { return surname; }
        set
        {
            if (value != surname)
            {
                surname = value;
                NotifyPropertyChanged();
            }

        }
    }

    public Students()
    {
        Name = "John";
        Surname = "Smith";
    }


}
MainPage.xaml

<Page.DataContext>
    <local:Students/>
</Page.DataContext>

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <StackPanel Margin="0,200,0,0">
        <TextBlock Text="{Binding Name}"/>
        <TextBlock Text="{Binding Surname}"/>
        <Button Content="Change Name" Click="change_name"/>
        <Button Content="Change Surname" Click="change_surname"/>
    </StackPanel>

</Grid>

我真的很困惑,因为当您使用编译时绑定时,它工作得很好。发生了什么事?

我看不到您正在将当前DataContext设置到对象的任何位置

 public MainPage()
    {
        this.InitializeComponent();
        st = new Students();
        this.DataContext = st;
    }
:您正在XAML中设置datacontext,但没有引用它

<Page.DataContext>
<local:Students/>
</Page.DataContext>

我的情况与作者非常相似(如果不是相同的话),我所做的唯一一件事就是将我的视图模型设置为公共财产。在上面的例子中,它将是
Students st
已更改为
public Students st{get;set;}

我在主页中设置了Datacontext。xaml,好的,我会尝试一下。@mishael ogochukwu--您正在xaml中设置它,它将创建该对象的新实例并将其分配给Datacontext。不幸的是,在事件处理程序中更改名称的对象不是该对象。查看我的编辑。你可以通过在学生构造函数中设置断点来验证Brian的答案,它会被击中两次。
<Page.DataContext>
<local:Students/>
</Page.DataContext>
 private void change_name(object sender, RoutedEventArgs e)
    {
        ((Students)this.DataContext).Name = "MM";
    }