В MVVM (обычно) каждый класс должен реализовывать INotifyPropertyChanged, и каждый установщик свойств должен вызывать событие изменения свойства:
public class Objective : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _text;
public string Text
{
get { return _text; }
set
{
if (_text != value)
{
_text = value;
FirePropertyChanged("Text");
}
}
}
private void FirePropertyChanged(string s)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(s));
}
}
}
Да: это подвержено ошибкам, и даже при некотором умном использовании lambda поддержка компилятора невелика. Но именно так нужно делать MVVM, и вы можете понять, почему в большинстве случаев знакомство с MVVM.
Однако, чтобы ответить на ваш вопрос, я бы порекомендовал вам просто добавить собственный код в ваш метод FirePropertyChanged:
public bool HasChanged { get; set; }
private void FirePropertyChanged(string s)
{
HasChanged = true;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(s));
}
}
И вам нужно не забыть установить значение HasChanged в false после того, как вы закончили чтение объекта из файла или базы данных.
10 баллов, если вы можете сказать мне, почему HasChanged не запускает PropertyChanged, несмотря на то, что я сказал выше. Это означает, конечно, что вы не должны использовать HasChanged из XAML
edit: Здесь есть отличный пример такого рода вещей: http://follesoe.no/silverlight/divelog/