I thought I was going crazy! Data from one class was magically appearing in another instance. After double checking all code paths and walking through in a debugger, I found the cause…

This is a user control, with a dependency property. The DP is a collection. Notice line 33 in the sample below. I am setting the "default value" for the property to an instance of a collection.

BAD, BAD, BAD.

It all makes sense now, given that a DP definition is static. It caught me off guard though because I'm used to setting the default value as part of the DP snippet. I wanted the collection to be instantiated with each new instance, so why not? Well, it does bad things is why not. In my case, other instances of the user control mysteriously had data in them that I never put there. The collection was effectively a static instance. Additionally, it would have been a GC root and prevented garbage collection of the collection and anything it referenced.

Lesson learned

  1. Don't use reference types as default values in Dependency Properties!
  2. Initialize in the constructor instead.

Sample

Here's a working sample of reference types in a dependency property that you can past into LinqPad to demonstrate the issue. You'll need to add references to a WindowsBase.dll and add namespace imports for System.Windows and System.Collections.ObjectModel for it to run. (just hit F4 in linqpad to see these options).

 

Cheers!