C# INotifyPropertyChanged不使用传统绑定,但使用编译绑定
我不知道我是否做错了什么,或者是否缺少了什么,但是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
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";
}