为什么单击按钮后文本块中的文本不会改变?
XAML:
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Text="{Binding Name}"/>
<Button Click="Button_Click" Grid.Row="1" Margin="20">Click Me</Button>
</Grid>
代码背后:
public partial class Window1 : Window, INotifyPropertyChanged
{
private Person _myPerson;
public Person MyPerson
{
get { return _myPerson; }
set
{
_myPerson = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("MyPerson"));
}
}
}
public Window1()
{
MyPerson = new Person { Name = "A" };
DataContext = MyPerson;
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
MyPerson = new Person { Name = "B" };
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
答案 0 :(得分:1)
<TextBlock Text="{Binding Name}"/>
在上面的代码中,您可以使用文本框和以下代码绑定属性Name
:
private void Button_Click(object sender, RoutedEventArgs e)
{
MyPerson = new Person { Name = "B" };
}
您将MyPerson
设置为新人。
Person
类是否会实现INotifyPropertyChanged
事件?
您只是更新MyPerson
属性。 DataContext
仍然使用以下行引用您创建的对象:
MyPerson = new Person { Name = "A" };
在构造函数中。您还需要更新DataContext
。
相反,请使用以下代码:
private void Button_Click(object sender, RoutedEventArgs e)
{
MyPerson = new Person { Name = "B" };
DataContext = MyPerson;
}
答案 1 :(得分:1)
更改
<TextBlock Text="{Binding Name}"/>
到
<TextBlock Text="{Binding MyPerson, Path=Name}"/>
由于您绑定了Name,因此当您更改MyPerson并且视图不会更新时,NotifyPropertyChanged将不会在Name上触发。
答案 2 :(得分:0)
你需要在Person类上实现INotifyPropertyChanged,然后只需更改MyPerson的名称来提升PropertyChanged,如果你想要它更清洁......
或者您可以将您创建的新创建的对象重新应用于DataContext,否则它将无效