Search code examples
wpfwpf-controlswpfdatagridwpftoolkitwpf-4.0

Should I always implement INotifyPropertyChanged interface in model?


If I have a model which is pretty much a readonly collection and dispayed on a grid, where the user selects a row.

Do I need to have INotifyPropertyChanged always implemented on the model? Is there a performance benefit of implementing vs not?

I would like to know if performance is impacted by UI trying to use something like

var x = Model as INotifyPropertyChanged;

which it wouldn't have used otherwise.


Solution

  • If you are using the model in any data bindings, then yes, you should implement INotifyPropertyChanged even if it is completely immutable. The reason has nothing to do with performance, but to avoid a memory leak.

    A Binding will always try to register for change notifications, and if you do not implement INotifyPropertyChanged or expose discrete change events of the form [Property]Changed, it will register through the PropertyDescriptor API. The default, reflection-based PropertyDescriptor implementation uses a global subscription table, and if for some reason the Binding does not unsubscribe cleanly, your view model will be kept alive indefinitely. This is in contrast to the weak event pattern used when bindings subscribe to INotifyPropertyChanged notifications. Bindings at runtime generally clean up after themselves, but the Xaml designer is notorious for leaking under these circumstances, causing your designer process's memory consumption to rise steadily as you work.