Вы повышаете PropertyChanged
для Person
экземпляра TestPerson
.Однако TestPerson
не изменилось, изменилось свойство Name
TestPerson
, и это свойство, к которому привязан Label
.
Редактировать: Чтобы ответить, почему ваши первые две версии работают
Назначение нового объекта _person (как в закомментированной строке)
Здесь вы фактически изменяете значение TestPerson
и поскольку DataContext
наследуется детьми, Label
также получает новый DataContext
, поэтому обновляется Binding
.
Удаление DataContext из StackPanelи пусть Label привязывается к Path = TestPerson.Name
Это то, чего я никогда не видел.Одна и та же привязка подписывается на PropertyChanged
для TestPerson
и Name
в Person
, поэтому повышение PropertyChanged
для любого из этих свойств будет работать.
Если вы хотите преодолеть это без реализации INotifyPropertyChanged
для Person
вы можете изменить значение UpdateSourceTrigger
на Explicit
<Label Name="label"
Content="{Binding Path=Name, UpdateSourceTrigger=Explicit}"/>
и обновить Binding
вручную каждый раз, когда Name
изменит
private void button1_Click(object sender, RoutedEventArgs e)
{
_person.Name = "Bill";
BindingExpression be = label.GetBindingExpression(Label.ContentProperty);
be.UpdateTarget();
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("TestPerson"));
}
}
В противном случае, простовнедрите INotifyPropertyChanged
для Person
, и это будет работать
public class Person : INotifyPropertyChanged
{
string _name = "Bob";
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged("Name");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}