Всякий раз, когда вам нужно уведомить пользовательский интерфейс о том, что данные, с которыми он связан, тоже изменились, вы должны сделать это через интерфейс INotifyPropertyChanged.
Обычно я реализую базовый класс с именем BindableObject, который реализует интерфейс для меня.Затем везде, где мне нужно поднять уведомления об изменениях, которые я наследую от BindableObject, и вызвать PropertyChange ("Foo")
BindableObject выглядит следующим образом:
public class BindableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void PropertyChange(String propertyName)
{
VerifyProperty(propertyName);
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
[Conditional("DEBUG")]
private void VerifyProperty(String propertyName)
{
Type type = GetType();
PropertyInfo info = type.GetProperty(propertyName);
if (info == null)
{
var message = String.Format(CultureInfo.CurrentCulture, "{0} is not a public property of {1}", propertyName, type.FullName);
//Modified this to throw an exception instead of a Debug.Fail to make it more unit test friendly
throw new ArgumentOutOfRangeException(propertyName, message);
}
}
}
Тогда, когда мне нужно вызвать внутри свойстваУ меня есть что-то вроде этого (обычно на установщика свойств)
private String foo;
public String Foo
{
get { return foo; }
set
{
foo = value;
PropertyChange("Foo");
}